SpringBoot通过AOP实现系统日志记录(一)-Controller层日志监控(包括系统日志监控)

75 阅读2分钟

@ControllerMonitor

@RequestMapping(value = "/getBusinessByCondition", method = RequestMethod.POST)

public ResponseResult getBusinessByCondition(@RequestBody BusinessBO businessBO) throws Exception {

//此处省略业务代码

}

}

4、Controller层日志拦截器

@Aspect

@Component

public class SystemLogAspect {

private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired

private SystemLogDAO systemLogDAO;

@Pointcut("execution(public * com.cy.ops.api..controller..(..))")

public void systemLog() {}

@Around(value = "systemLog()")

public ResponseResult doAround(ProceedingJoinPoint joinPoint) throws Throwable {

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

HttpServletRequest request = attributes.getRequest();

HttpServletResponse response = attributes.getResponse();

UserInfoBO userInfo = WebSession.getUserInfo(request, response);

if(userInfo == null) {

return new ResponseResult().setSuccess(false).setMessage(ResultCode.RECORD_LOGIN_EXPIRE.getMessage()).setCode(ResultCode.RECORD_LOGIN_EXPIRE.getCOde());

}

//1、记录执行时间

long startTime = System.currentTimeMillis();

ResponseResult result = (ResponseResult) joinPoint.proceed(joinPoint.getArgs());

long endTime = System.currentTimeMillis();

long totalTime = endTime - startTime;

//2、有无日志监控注解,有则输出

String methodName = joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()";

MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();

Method targetMethod = methodSignature.getMethod();

if(targetMethod.isAnnotationPresent(ControllerMonitor.class)) {

logger.info("Method: {}, Start: {}, End: {}, Total: {}ms", methodName, dateFormat.format(startTime), dateFormat.format(endTime), totalTime);

}

//3、入系统日志表

SystemLogDO systemLogDO = new SystemLogDO();

if(joinPoint.getArgs().length > 0){

systemLogDO.setPara(JsonToBeanUtil.beanToJSON(joinPoint.getArgs()[0]));

}

systemLogDO.setClientIp(IpUtil.getClientIp(request));

systemLogDO.setMethod(joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()");

systemLogDO.setOperator(userInfo.getUserName());

systemLogDO.setReqUri(request.getRequestURI());

systemLogDO.setReturnData(JsonToBeanUtil.beanToJSON(result));

systemLogDO.setStartTime(String.valueOf(startTime));

systemLogDO.setEndTime(String.valueOf(endTime));

systemLogDO.setTotalTime(String.valueOf(totalTime));

systemLogDO.setGmtCreateUser(userInfo.getUserName());

systemLogDO.setGmtModifiedUser(userInfo.getUserName());

systemLogDO.setIsDelete(0);

systemLogDAO.insert(systemLogDO);

return result;

}

}

5、IPUtil工具类

package com.gcloud.common;

import javax.servlet.http.HttpServletRequest;

import java.net.InetAddress;

import java.net.NetworkInterface;

import java.net.SocketException;

import java.net.UnknownHostException;

import java.util.Enumeration;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

/**

  • @Description: IP工具类

  • @Author: zhangzhixiang

  • @CreateDate: 2018/11/08 16:08:54

  • @Version: 1.0

*/

public class IPUtil {

/**

  • 检查IP是否合法

  • @param ip

  • @return

*/

public static boolean ipValid(String ip) {

String regex0 = "(2[0-4]\d)" + "|(25[0-5])";

String regex1 = "1\d{2}";

String regex2 = "[1-9]\d";

String regex3 = "\d";

String regex = "(" + regex0 + ")|(" + regex1 + ")|(" + regex2 + ")|(" + regex3 + ")";

regex = "(" + regex + ").(" + regex + ").(" + regex + ").(" + regex + ")";

Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(ip);

return m.matches();

}

/**

  • 获取本地ip 适合windows与linux

  • @return

*/

public static String getLocalIP() {

String localIP = "127.0.0.1";

try {

Enumeration netInterfaces = NetworkInterface.getNetworkInterfaces();

while (netInterfaces.hasMoreElements()) {

NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement();

InetAddress ip = ni.getInetAddresses().nextElement();

if (!ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {

localIP = ip.getHostAddress();

break;

}

}

} catch (Exception e) {

try {

localIP = InetAddress.getLocalHost().getHostAddress();

} catch (UnknownHostException e1) {

e1.printStackTrace();

}

}

return localIP;

}

/**

  • 获取客户机的ip地址

  • @param request

  • @return

*/

public static String getClientIp(HttpServletRequest request) {

String ip = request.getHeader("x-forwarded-for");

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("Proxy-Client-IP");

}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("WL-Proxy-Client-IP");

}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getRemoteAddr();

}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("http_client_ip");

}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("HTTP_X_FORWARDED_FOR");

}

// 如果是多级代理,那么取第一个ip为客户ip

if (ip != null && ip.indexOf(",") != -1) {

ip = ip.substring(ip.lastIndexOf(",") + 1, ip.length()).trim();

}

return ip;

}

/**

  • 把ip转化为整数

  • @param ip

  • @return

*/

public static long translateIP2Int(String ip){

String[] intArr = ip.split("\.");

int[] ipInt = new int[intArr.length];

for (int i = 0; i <intArr.length ; i++) {

ipInt[i] = new Integer(intArr[i]).intValue();

}

return ipInt[0] * 256 * 256 * 256 + + ipInt[1] * 256 * 256 + ipInt[2] * 256 + ipInt[3];

}

public static void main(String[] args) {

System.out.println(getLocalIP());

}

}

6、结果返回实体类

public class ResponseResult implements Serializable {

private static final long serialVersionUID = 6054052582421291408L;

private String message;

private Object data;

private int code;

private boolean success;

private Long total;

public ResponseResult(){}

public ResponseResult(boolean success, Object data) {

this.success = success;

this.data = data;

}

public ResponseResult(boolean success, String message, Object data) {

this.success = success;

this.message = message;

this.data = data;

}

public String getMessage() {

return message;

}

public ResponseResult setMessage(String message) {

this.message = message;

return this;

}

public Object getData() {

return data;

}

public ResponseResult setData(Object data) {

this.data = data;

return this;

}

public boolean getSuccess() {

return success;

}

public ResponseResult setSuccess(boolean success) {

this.success = success;

return this;

}

public int getCode() {

return code;

}

public ResponseResult setCode(int code) {

this.code = code;

return this;

}

public Long getTotal() {