目录结构
pom.xml文件添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Logger name="com.sbm" level="trace" additivity="false">
<AppenderRef ref="Console" />
</Logger>
<Root level="error">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
Aop记录Log类:AppLogAspect
package com.sbm.aspects
import com.sbm.util.IPUtil
import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.Logger
import org.aspectj.lang.JoinPoint
import org.aspectj.lang.annotation.AfterReturning
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before
import org.aspectj.lang.annotation.Pointcut
import org.springframework.core.annotation.Order
import org.springframework.stereotype.Component
import org.springframework.web.context.request.RequestContextHolder
import org.springframework.web.context.request.ServletRequestAttributes
import javax.servlet.http.HttpServletRequest
import java.util.Arrays
import java.util.Enumeration
@Component
@Aspect
@Order(-5)
public class AppLogAspect {
private Logger logger = LogManager.getLogger(AppLogAspect.class)
// 保证每个线程都有一个单独的实例
private ThreadLocal<Long> time = new ThreadLocal<>()
@Pointcut("execution(* com.sbm.controller..*.*(..))")
public void pointcut() {
}
@Before("pointcut()")
public void doBefore(JoinPoint joinPoint) {
time.set(System.currentTimeMillis())
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes()
HttpServletRequest request = attributes.getRequest()
//记录请求的内容
logger.info("Request URL: " + request.getRequestURL().toString())
logger.info("Request Method: " + request.getMethod())
logger.info("User-Agent: " + request.getHeader("User-Agent"))
logger.info("Class Method: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName())
logger.info("Cookies: " + request.getCookies())
logger.info("Params: " + Arrays.toString(joinPoint.getArgs()))
Enumeration<String> enums = request.getParameterNames()
while (enums.hasMoreElements()) {
String paraName = enums.nextElement()
logger.info(paraName + ":" + request.getParameter(paraName))
}
}
@AfterReturning("pointcut()")
public void doAfterReturning(JoinPoint joinPoint) {
logger.info("耗时 : " + ((System.currentTimeMillis() - time.get())) + "ms")
logger.info("AppLogAspect.doAfterReturning()")
}
}
简单的controller请求
@RequestMapping("/message/{currentPage}")
public String message(@PathVariable("currentPage") Integer currentPage, Model model){
if(currentPage!= null){
PageHelper.startPage(currentPage, 11);
}
LOGGER.debug("程序执行的时候输出Log日志...");
List<Message> messages = messageService.list();
model.addAttribute("messages", messages);
return "message";
}
测试效果