log4j2 sl4j 实践

经历几个项目后,发现不同的项目用的日志框架也不太一样,导致每次在应用层输出日志的写法不统一。或者日志不输出,或者不能在调试时候输出自己想要的日志级别。
首先,日志对业务很重要,其次,在分析别人源码,或者一些开源框架在启动时都会打出相应的日志。理解好日志系统,也能帮助我们更好的学习别人的项目。
之前在使用开源技术的时候一般都是在网上找各种maven,配置等。后来发现一味的直接去拿,自己的印象不深,并且经常会遇到和预期结果不一样。只能改了又试,试了又改,
(在日志配置这块我经常这样折腾自己)非常浪费时间,所以现在要慢慢养成看官方文档的习惯。

常见的日志框架

我们常见的日志框架包括:logback,log4j,log4j2等,slf4j只是一个抽象的日志api,他的作用是不改变应用层日志的写法,可以根据需求切换不同的日志框架。
slf4j的官方文档里面有一个介绍视频:https://www.slf4j.org/docs.html 我们这里采用slf4j log4j2的组合。

maven依赖

sl4j
log4j2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>

为什么只需要应用这几个jar?官方文档中有一句:Simply include the Log4j 2 SLF4J Binding jar along with the Log4j 2 jars and SLF4J API jar to cause all SLF4J logging to be handled by Log4j 2.
大概翻译就是:只需要引用 Log4j 2 SLF4J Binding jar ,Log4j 2 jars,SLF4J API jar 就可以让log4j 2来处理日志

配置

配置的话,我们可以参考log4j官方文档:https://logging.apache.org/log4j/2.x/manual/configuration.html

配置文件

文档中有写配置文件的加载顺序,应用层的一般写法是在resource目录下新建一个命名为:log4j2.xml的配置文件,注意log4j2不再支持.properties配置文件。

是否需要显示的在spring中激活配置文件?

答案是否。https://logging.apache.org/log4j/2.x/manual/webapp.html 官方文档中讲到:servlet 3.0 以及高于他的版本会自动加载这个配置文件,紧接着,文档提到。tomcat7.0 版本会忽略log4j .jar的JAR文件
所以必须得将web容器升级到8.0或者更高。或者修改catalina.properties并从jarsToSkip属性中删除“log4j
.jar”。

配置文件详解

默认配置

log4j2 提供了一个默认配置

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

可配置的属性

配置之前,先了解一下log4j2 的各项配置参数

Configuring loggers
  • name:
  • level:TRACE, DEBUG, INFO, WARN, ERROR
  • additivity:默认为false,不叠加属性(不叠加时以root为主)
    LoggerConfig可以配置一个或者多个AppenderRef,每个appender都会被调用;
    所有的logger配置继承root logger,root的作用是收集下面所有反馈上来的信息流并根据配置在root中appender进行输出,但是logger中配置了additivity=”false”,就不会反馈到root中.
    如果logger中配置additivity=”true”,日志不仅会在logger配置的appender中输出,还会反馈到root中配置的appender输出。应用场景:需要分开打印日志。
Configuring Appenders

logger 负责收集日志流,appender负责输出到文件,控制台或者其他。https://logging.apache.org/log4j/2.x/manual/appenders.html