1.引入依赖:
<!--引入面向切面依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- spring-boot-starter-web中需要排除logging的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 排除掉logging,不使用logback,改用log4j2,否则会报错 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
2.编写log4j2.xml文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingFile name="serverLog" fileName="logs/server-log.log"
filePattern="logs/server-log-%d{yyyy-MM-dd}-%i.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy/>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<Async name="async">
<AppenderRef ref="serverLog"/>
</Async>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="console"/>
<AppenderRef ref="async"/>
</Root>
</Loggers>
</Configuration>
说明:
把log4j2.xml放到resource目录下:
3.在application.yml文件配置,如下:
logging:
config: classpath:log4j2.xml
说明:
把log4j2.xml文件引入到logging的config里面。
4.通过AOP实现日志的打印和收集(重要)
4.1.编写一个切面组件LogAspect.java,如下:
说明:
@Aspect:声明一个切面
@Component:把自定义的切面组件注入到IOC容器中
@Pointcut:声明一个自定义的切入点
@Around:切面的环绕通知,实现日志和采集的业务
package com.lz.hehuorenservice.common.component;
import com.alibaba.fastjson.JSON;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
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.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
* Create by hyhweb on 2021/6/19 17:23
*
* @author Administrator
*/
@Aspect
@Component
public class LogAspect {
private Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Pointcut("execution(* com.lz.hehuorenservice.*.controller.*.*(..))")
public void LogPointcut() {}
@Around("LogPointcut()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes =
(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
javax.servlet.http.HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
logger.info("请求连接 : " + request.getRequestURL().toString());
logger.info("请求方法 : " + request.getMethod());
logger.info("传入参数 :{} ", proceedingJoinPoint.getArgs());
// 获取方法的返回结果
Object result = proceedingJoinPoint.proceed();
logger.info("返回数据:{}", JSON.toJSONString(result));
return result;
}
@AfterThrowing(value = "LogPointcut()", throwing = "e")
public void doThrow(JoinPoint joinPoint, Exception e) {
Signature signature = joinPoint.getSignature();
String name = signature.getName();
logger.info("异常信息:{}:{}", name, e.getMessage());
}
}
5.效果如下:
5.1.控制台打印日志:
5.2.日志采集保存成文件: