一、背景
最近由于项目的需要,我们把 log4j 1.x 的版本全部迁移成 log4j 2.x 的版本,那随之而来的 slf4j 整合 log4j 的配置(使用 Slf4j 集成 Log4j2 构建项目日志系统的完美解决方案)以及 log4j2 配置文件的详解,就需要我们来好好聊一聊了。本文就专门来讲解下 log4j2.xml 配置文件的各项标签的意义。
二、配置全解
1. 关于配置文件的名称以及在项目中的存放位置
log4j 2.x 版本不再支持像 1.x 中的.properties 后缀的文件配置方式,2.x 版本配置文件后缀名只能为 ”.xml”,”.json” 或者 ”.jsn”.
系统选择配置文件的优先级 (从先到后) 如下:
(1).classpath 下的名为 log4j2-test.json 或者 log4j2-test.jsn 的文件.
(2).classpath 下的名为 log4j2-test.xml 的文件.
(3).classpath 下名为 log4j2.json 或者 log4j2.jsn 的文件.
(4).classpath 下名为 log4j2.xml 的文件.
我们一般默认使用 log4j2.xml 进行命名。如果本地要测试,可以把 log4j2-test.xml 放到 classpath,而正式环境使用 log4j2.xml,则在打包部署的时候不要打包 log4j2-test.xml 即可。
2. 缺省默认配置文件
<?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>
3. 配置文件节点解析
(1). 根节点 Configuration 有两个属性:status 和 monitorinterval, 有两个子节点:Appenders 和 Loggers(表明可以定义多个 Appender 和 Logger).
status 用来指定 log4j 本身的打印日志的级别.
monitorinterval 用于指定 log4j 自动重新配置的监测间隔时间,单位是 s, 最小是 5s.
(2).Appenders 节点,常见的有三种子节点:Console、RollingFile、File.
Console节点用来定义输出到控制台的 Appender.
name: 指定 Appender 的名字.
target:SYSTEM_OUT 或 SYSTEM_ERR, 一般只设置默认:SYSTEM_OUT.
PatternLayout: 输出格式,不设置默认为:%m%n.
File节点用来定义输出到指定位置的文件的 Appender.
name: 指定 Appender 的名字.
fileName: 指定输出日志的目的文件带全路径的文件名.
PatternLayout: 输出格式,不设置默认为:%m%n.
RollingFile节点用来定义超过指定大小自动删除旧的创建新的的 Appender.
name: 指定 Appender 的名字.
fileName: 指定输出日志的目的文件带全路径的文件名.
PatternLayout: 输出格式,不设置默认为:%m%n.
filePattern: 指定新建日志文件的名称格式.
Policies: 指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
TimeBasedTriggeringPolicy:Policies 子节点,基于时间的滚动策略,interval 属性用来指定多久滚动一次,默认是 1 hour。modulate=true 用来调整时间:比如现在是早上 3am,interval 是 4,那么第一次滚动是在 4am,接着是 8am,12am… 而不是 7am.
SizeBasedTriggeringPolicy:Policies 子节点,基于指定文件大小的滚动策略,size 属性用来定义每个日志文件的大小.
DefaultRolloverStrategy: 用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过 max 属性)。
(3).Loggers 节点,常见的有两种:Root 和 Logger.
Root节点用来指定项目的根日志,如果没有单独指定 Logger,那么就会默认使用该 Root 日志输出
level: 日志输出级别,共有 8 个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
AppenderRef:Root 的子节点,用来指定该日志输出到哪个 Appender.
Logger节点用来单独指定日志的形式,比如要为指定包下的 class 指定不同的日志级别等。
level: 日志输出级别,共有 8 个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
name: 用来指定该 Logger 所适用的类或者类所在的包全路径, 继承自 Root 节点.
AppenderRef:Logger 的子节点,用来指定该日志输出到哪个 Appender, 如果没有指定,就会默认继承自 Root. 如果指定了,那么会在指定的这个 Appender 和 Root 的 Appender 中都会输出,此时我们可以设置 Logger 的 additivity=”false” 只在自定义的 Appender 中进行输出。
(4). 关于日志 level.
共有 8 个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
All: 最低等级的,用于打开所有日志记录.
Trace: 是追踪,就是程序推进以下,你就可以写个 trace 输出,所以 trace 应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.
Debug: 指出细粒度信息事件对调试应用程序是非常有帮助的.
Info: 消息在粗粒度级别上突出强调应用程序的运行过程.
Warn: 输出警告及 warn 以下级别的日志.
Error: 输出错误信息日志.
Fatal: 输出每个严重的错误事件将会导致应用程序的退出的日志.
OFF: 最高等级的,用于关闭所有日志记录.
程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。
4. 比较完整的 log4j2.xml 配置模板
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration 后面的 status,这个用于设置 log4j2 自身内部的信息输出,可以不设置,当设置成 trace 时,你会看到 log4j2 内部各种详细输出 -->
<!--monitorInterval:Log4j 能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->
<configuration status="WARN" monitorInterval="30">
<!-- 先定义所有的 appender-->
<appenders>
<!-- 这个输出控制台的配置 -->
<console name="Console" target="SYSTEM_OUT">
<!-- 输出日志的格式 -->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
<!-- 文件会打印出所有信息,这个 log 每次运行程序会自动清空,由 append 属性决定,这个也挺有用的,适合临时测试用 -->
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- 这个会打印出所有的 info 及以下级别的信息,每次大小超过 size,则这 size 大小的日志会自动存入按年份 - 月份建立的文件夹下面并进行压缩,作为存档 -->
<RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<!-- 控制台只输出 level 及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy 属性如不设置,则默认为最多同一文件夹下 7 个文件,这里设置了 20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<!-- 然后定义 logger,只有定义了 logger 并引入的 appender,appender 才会生效 -->
<loggers>
<!-- 过滤掉 spring 和 mybatis 的一些无用的 DEBUG 信息 -->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>