1,在配置文件中,排除原本的logging组件
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 排除logging组件--> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency>
引入log4j2组件
<!-- log4j2日志组件引入 ,引入日志组件后需要进行配置,配置文件放在resources中--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
2,配置log4j2配置文件,log4j2.xml,放在resources包内
<?xml version="1.0" encoding="UTF-8"?> <!--日志级别:error,warn,info,debug,trace--> <Configuration status="fatal"> <!-- ************************ 自定义目录,每个计算机不一样,value为配置文件的位置,这个文件夹需要手动建立 (这是Linux 的Windows直接复制就行${baseDir}/debug.log)**********************--> <Properties> <Property name="baseDir" value="D:\log4j2\logs"/> </Properties> <!--Console代表控制台,设置级别是info只会打印级别大于等于info的日志--> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{MM:dd HH:mm:ss.SSS}] [%level] [%logger{36}] - %msg%n"/> </Console> <!--debug级别日志文件输出--> <!-- 此处的fireName引用上面的文件路径(这是Linux 的Windows直接复制就行${baseDir}/debug.log)--> <RollingFile name="debug_appender" fileName="D:\log4j2\logs\debug.log" filePattern="${baseDir}/debug_%i.log.%d{yyyy-MM-dd}"> <!-- 过滤器 --> <Filters> <!-- 限制日志级别在debug及以上在info以下 --> <ThresholdFilter level="debug"/> <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/> </Filters> <!-- 日志格式 --> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <!-- 策略 --> <Policies> <!-- 每隔一天转存,每隔一天新生成一个文件 --> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 文件大小 --> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> </RollingFile> <!-- info级别日志文件输出 --> <RollingFile name="info_appender" fileName="D:\log4j2\logs\info.log" filePattern="${baseDir}/info_%i.log.%d{yyyy-MM-dd}"> <!-- 过滤器 --> <Filters> <!-- 限制日志级别在info及以上在error以下 --> <ThresholdFilter level="info"/> <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> </Filters> <!-- 日志格式 --> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <!-- 策略 --> <Policies> <!-- 每隔一天转存 --> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 文件大小 --> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> </RollingFile> <!-- error级别日志文件输出 --> <RollingFile name="error_appender" fileName="D:\log4j2\logs\error.log" filePattern="${baseDir}/error_%i.log.%d{yyyy-MM-dd}"> <!-- 过滤器 --> <Filters> <!-- 限制日志级别在error及以上 --> <ThresholdFilter level="error"/> </Filters> <!-- 日志格式 --> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <Policies> <!-- 每隔一天转存 --> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 文件大小 --> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> </RollingFile> </Appenders> <!-- 把配置过的定义出来--> <Loggers> <Root level="debug"> <AppenderRef ref="Console"/> <AppenderRef ref="debug_appender"/> <AppenderRef ref="info_appender"/> <AppenderRef ref="error_appender"/> </Root> </Loggers> </Configuration>
3,配置AOP
<!-- aop处理请求日志--> <!-- 有了aop依赖要建立过滤器,对请求进行拦截和打印--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
4,创建filter包,创建WebLogAspect类
package com.example.demo.filter; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.servlet.mvc.condition.RequestConditionHolder; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; /** * 描述: 打印请求和响应信息 * 1,进行配置@Aspect * 2,@Component让Spring识别到 * 3,日志Logger类java开发过程中经常需要打印日志信息,往往会在每个类的第一行加上形如以下代码: * protected static final Logger logger = LoggerFactory.getLogger(XXX.class);XXX这个类的类名 */ @Aspect @Component /** * webLog 指定拦截点的方法 */ public class WebLogAspect { private final Logger log = LoggerFactory.getLogger(WebLogAspect.class); //类中定义要拦截的内容和拦截点,一般都是controller中间的内容 @Pointcut("execution(public * com.example.demo.controller.*.*(..)))") public void webLog(){ } //需要在拦截点的前和后分别拦截,之前是请求信息,之后是响应信息 @Before("webLog()") public void doBefore(JoinPoint joinPoint){ //收到请求,记录请求内容 ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = requestAttributes.getRequest(); log.info("REQUEST URL:" + request.getRequestURL().toString());//URL信息 log.info("HTTP_METHOD :" + request.getMethod());//请求的类型 log.info("IP : " + request.getRemoteAddr());//IP log.info("CLASS_METHOD :" + joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());//类的方法 log.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));//参数 } //响应 @AfterReturning(returning = "res", pointcut = "webLog()")//参数,(返回的内容,拦截的点) public void doAfterReturning(Object res) throws JsonProcessingException { //处理完请求返回内容 log.info("RESPONSE : " + new ObjectMapper().writeValueAsString(res)); } }
重启服务器即可发现已经完成基本配置