所需额外依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
切面类
package com.zy.admin.aspect;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.zy.admin.domain.ExceptionLog;
import com.zy.admin.domain.Syslog;
import com.zy.admin.mapper.ILogMapper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Date;
@Aspect
@Component
public class LogAspect {
private Date visitTime;
private String username;
private String url;
private String ip;
private String classMethod;
private String args;
@Autowired
private HttpServletRequest request;
@Autowired
private ILogMapper logMapper;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Pointcut("execution(* com.zy.admin.web.*.*(..))")
public void log(){}
@Pointcut("execution(* com.zy.admin.web.admin.*.*(..))")
public void log1(){}
@Before("log() || log1()")
public void doBefore(JoinPoint joinPoint){
visitTime = new Date();
url = request.getRequestURL().toString();
ip = "";
String ip1 = request.getHeader("X-Forwarded-For");
if(ip1 != null && !"unKnown".equals(ip1)){
int index = ip1.indexOf(",");
if(index != -1){
ip = ip1.substring(0,index);
}else{
ip = ip1;
}
}else{
ip1 = request.getHeader("X-Real-IP");
if(ip1 != null && !"unKnown".equals(ip1)){
ip = ip1;
}else{
ip = request.getRemoteAddr();
}
}
classMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
Object[] argsValue = joinPoint.getArgs();
args = Arrays.toString(argsValue);
SecurityContext context = SecurityContextHolder.getContext();
Object principal = context.getAuthentication().getPrincipal();
if("anonymousUser".equals(principal)){
username = null;
}else{
User user = (User) principal;
username = user.getUsername();
}
logger.info("--------------------------------BeforeStart-----------------------------------------");
logger.info("url : {}", url);
logger.info("ip : {}", ip);
logger.info("classMethod : {}", classMethod);
logger.info("args : {}", args);
logger.info("username : {}", username);
logger.info("visitTime : {}", visitTime);
logger.info("--------------------------------BeforeEnd-----------------------------------------");
}
@AfterReturning(returning = "resultValue",pointcut = "log() || log1()")
public void doAfterReturn(Object resultValue) throws Exception {
String result = JSON.toJSONString(resultValue, SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.WriteMapNullValue);
Long executionTime = new Date().getTime() - visitTime.getTime();
logger.info("--------------------------------doAfterReturnStart-----------------------------------------");
logger.info("Result : {}", resultValue);
logger.info("executionTime : {}", executionTime);
logger.info("--------------------------------doAfterReturnEnd-----------------------------------------");
Syslog syslog = new Syslog(null, visitTime, username, url, ip, executionTime, classMethod, args, result);
}
@AfterThrowing(throwing = "e",pointcut = "log() || log1()")
public void doAfterThrowing(Throwable e) throws Exception {
Date happenTime = new Date();
String exceptionJson = JSON.toJSONString(e, SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.WriteMapNullValue);
String exceptionMessage = e.getMessage();
Long executionTime = new Date().getTime() - visitTime.getTime();
logger.info("--------------------------------doAfterThrowingStart-----------------------------------------");
logger.info("exceptionJson : {}", exceptionJson);
logger.info("exceptionMessage : {}", exceptionMessage);
logger.info("happenTime : {}", happenTime);
logger.info("executionTime : {}", executionTime);
logger.info("--------------------------------doAfterThrowingEnd-----------------------------------------");
ExceptionLog exceptionLog = new ExceptionLog(null, exceptionMessage, happenTime,url,executionTime,classMethod,args);
}
@After("log() || log1()")
public void After(){
logger.info("--------------------------------doAfter----------------------------------------");
}
}
日志类
package com.zy.admin.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Syslog {
private Long id;
private Date visitTime;
private String username;
private String url;
private String ip;
private Long executionTime;
private String classMethod;
private String args;
private String result;
}
package com.zy.admin.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ExceptionLog {
private Long id;
private String exceptionMessage;
private Date happenTime;
private String url;
private Long executionTime;
private String classMethod;
private String args;
}
Mapper
package com.zy.admin.mapper;
import com.zy.admin.domain.ExceptionLog;
import com.zy.admin.domain.Syslog;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ILogMapper {
void saveSyslog(Syslog syslog) throws Exception;
void saveExceptionLog(ExceptionLog exceptionLog) throws Exception;
}
sql
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.admin.mapper.ILogMapper">
<insert id="saveSyslog">
insert into syslog (id,visit_time,username,ip,url,execution_time,class_method,args,result) values
(UUID_SHORT(),#{visitTime},#{username},#{ip},#{url},#{executionTime},#{classMethod},#{args},#{result})
</insert>
<insert id="saveExceptionLog">
insert into exception_log (id,happen_time,exceptionMessage,url,execution_time,class_method,args) values
(UUID_SHORT(),#{happenTime},#{exceptionMessage},#{url},#{executionTime},#{classMethod},#{args})
</insert>
</mapper>
数据库表
create table syslog(
id bigint not null primary key,
visit_time timestamp,
username varchar(50),
ip varchar(30),
url varchar(50),
execution_time bigint,
class_method varchar(200),
args text,
result text
);
create table exception_log(
id bigint not null primary key,
happen_time timestamp,
exceptionMessage varchar(100),
url varchar(100),
execution_time bigint,
class_method varchar(200),
args text
);