版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_36553913/article/details/83720528
说明
在学习springboot时,学习了log4j2日志文件的使用,使用AOP统一处理web请求日志,将日志记录到MongoDB中等内容,通过本篇博文,记录总结下springboot中日志的输出以及log4j2的配置、
正文
引入依赖
去除web自带的日志,引入log4j2的依赖,aop和mongo依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<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>
<!--mongodb-driver -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
</dependency>
<!-- log4j-nosql -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-nosql</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
配置文件log4j2.xml
在引入log4j2后,需要下resources目录下创建配置文件log4j2.xml文件,通过官方文档,可以对配置文件的结构有一个大概的了解,更详细的内容见:官方文档
<?xml version="1.0" encoding="UTF-8"?>;
<Configuration>
<Properties>
<Property name="name1">value</property>
<Property name="name2" value="value2"/>
</Properties>
<Filter type="type" ... />
<Appenders>
<Appender type="type" name="name">
<Filter type="type" ... />
</Appender>
...
</Appenders>
<Loggers>
<Logger name="name1">
<Filter type="type" ... />
</Logger>
...
<Root level="level">
<AppenderRef ref="name"/>
</Root>
</Loggers>
</Configuration>
这里通过配置文件,将日志信息分类保存到不同的文件,并且将日志信息输出到MongoDB中
<?xml version="1.0" encoding="UTF-8"?>
<!--启动项设置为 trace,加载 springboot 启动内部各种详细输出-->
<Configuration status="WARN">
<Properties>
<Property name="file_path">F:\StudyProject\springboot_study\log4j2\logs</Property>
</Properties>
<Appenders>
<!--添加一个控制台追加器-->
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout>
<!--<pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</pattern>-->
<pattern>[%d] - [%c] - [%highlight{%level}] - [%method] - [%t] - %msg%n</pattern>
</PatternLayout>
</Console>
<!--添加一个文本追加器-->
<File name="File" fileName="C:\Users\wds\Desktop\springboot_study\log4j2\log.log">
<PatternLayout>
<pattern>[%-5p] %d %c - %m%n</pattern>
</PatternLayout>
</File>
<RollingFile name="RollingFileInfo" fileName="${file_path}/info/info.log"
filePattern="${file_path}/$${date:yyyy-MM}/info/info-%d{yyyy-MM-dd}-%i.log.gz">
<!--<Filters>-->
<ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"></ThresholdFilter>
<!--<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"></ThresholdFilter>-->
<!--</Filters>-->
<PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
<Policies>
<!--归档每天的文件-->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!--限制单个文件的大小-->
<SizeBasedTriggeringPolicy size="2MB"></SizeBasedTriggeringPolicy>
</Policies>
<!-- 限制每天的文件个数 -->
<DefaultRolloverStrategy compressionLevel="0" max="10"></DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${file_path}/warn/warn.log"
filePattern="${file_path}/$${date:yyyy-MM}/warn/warn-%d{yyyy-MM-dd}-%i.log.gz">
<!--<Filters>-->
<!--<ThresholdFilter level="WARN"></ThresholdFilter>-->
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"></ThresholdFilter>
<!--</Filters>-->
<PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
<Policies>
<!--归档每天的文件-->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!--限制单个文件的大小-->
<SizeBasedTriggeringPolicy size="2MB"></SizeBasedTriggeringPolicy>
</Policies>
<DefaultRolloverStrategy compressionLevel="0" max="10"></DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${file_path}/error/error.log"
filePattern="${file_path}/$${date:yyyy-MM}/error/error-%d{yyyy-MM-dd}-%i.log.gz">
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"></ThresholdFilter>
<PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
<Policies>
<!--归档每天的文件-->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!--限制单个文件的大小-->
<SizeBasedTriggeringPolicy size="2MB"></SizeBasedTriggeringPolicy>
</Policies>
<DefaultRolloverStrategy compressionLevel="0" max="10"></DefaultRolloverStrategy>
</RollingFile>
<NoSql name="databaseAppender">
<MongoDB databaseName="test" collectionName="newlog" server="127.0.0.1" port="27017"></MongoDB>
</NoSql>
</Appenders>
<Loggers>
<Logger name="com.example.log4j2" level="DEBUG" additivity="true">
<AppenderRef ref="File"></AppenderRef>
</Logger>
<Logger name="mongolog" level="trace" additivity="true">
<AppenderRef ref="databaseAppender"/>
</Logger>
<Root level="INFO">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFileInfo" />
<AppenderRef ref="RollingFileWarn" />
<AppenderRef ref="RollingFileError" />
<AppenderRef ref="databaseAppender"/>
</Root>
</Loggers>
</Configuration>
AOP处理web请求日志
通过对controller设置切面来记录日志信息
@Aspect
@Component
public class WebLogAspect {
private Logger logger = LogManager.getLogger(this.getClass());
ThreadLocal<Long> startTime = new ThreadLocal<>();
@Pointcut("execution(public * com.example.log4j2.controller..*.*(..))")
public void webLog(){
}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable{
//接受到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = (HttpServletRequest) attributes.getRequest();
logger.info("URL : " + request.getRequestURL().toString());
logger.info("HTTP_METHOD : " + request.getMethod());
logger.info("IP : " + request.getRemoteAddr());
logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
startTime.set(System.currentTimeMillis());
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable{
logger.info("RESPONSE : " + ret);
logger.info("SPEND TIME : " + (System.currentTimeMillis() - startTime.get()));
}
@Around("webLog()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
logger.info(System.currentTimeMillis());
Object object = proceedingJoinPoint.proceed();
System.out.println(object);
logger.info(System.currentTimeMillis());
return object;
}
}
源码地址:https://github.com/Edenwds/springboot_study/tree/master/log4j2
参考资料:
http://blog.didispace.com/springbootaoplog/
https://logging.apache.org/log4j/2.x/manual/configuration.html#Loggers