SpringBoot有自己的日志框架,比如 SLF4J和logback,今天不使用他们两个。今天就结合Spring框架学习的AOP搞一个自定义日志记录。
首先加入AOP依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
定义一个注解@:
import java.lang.annotation.*;
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
/** 要执行的操作类型比如:add操作 **/
String value() default "";
}
编写一个Aspect类,使用@sysLog在Controller层的每一个方法前注入,然后根据我们的日志需求编写相应的代码,并可以通过Service把日志保存在数据库中:
@Aspect
@Component
public class SysLogAspect {
private static final Logger logger = LoggerFactory.getLogger(SysLogAspect.class);
@Autowired
private LogService logService;
//Controller层切点
@Pointcut("execution (* com.***.***.controller..*.*(..))")
public void controllerAspect() {}
@After("@annotation(sysLog)")
public void doBefore(JoinPoint joinPoint,SysLog sysLog) {
String id = StringUtils.getUUID();
//获取注解里的值
String operation = sysLog.value();
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
HttpSession session = request.getSession();
String loginName = (String) session.getAttribute("loginName");
String ip = request.getRemoteHost();
String url = request.getRequestURL().toString();
String method = request.getMethod();
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
String date = DateUtils.getYearDate();
Log log = new Log();
log.setId(id);
log.setLoginname(loginName);//用户名
log.setIp(ip);//请求ip
log.setUrl(url);//请求url
log.setMethod(method);//请求方式
log.setOperation(operation);//执行的操作
log.setTargetName(targetName);//请求的Controller
log.setMethodName(methodName);//请求的方法
log.setDate(date);//请求时间
int result = logService.insert(log);
if(result == 1 ){
logger.info("新增一条日志记录:"+log.toString());
}else{
logger.error("新增日志记录失败!!!");
}
}
}
@SysLog注解方法:
效果: