log4j2 配置简要分析
从一个log4j2的xml配置说起
对于做后端的同学来说,log是分析bug、查找问题不可或缺的工具,好的日志配置将使我们的开发工作如虎添翼。 把视线聚焦到java,常用的日志工具有log4j,log4j2以及logback等,其中log4j2功能较为强大,运行效率也较高,我们就来用一个例子看一看log4j2的配置思路,下面就是这个配置文件:
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="instance">$${sys:instance}</Property>
<Property name="log.dir">$${sys:logdir}</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n"/>
</Console>
<RollingRandomAccessFile name="infoLog" fileName="${log.dir}/${instance}-info.log"
filePattern="${log.dir}/%d{yyyy-MM}/${instance}-info-%d{yyyy-MM-dd}-%i.log.gz"
append="true">
<PatternLayout
pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n"/>
<Filters>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
</Filters>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policies>
</RollingRandomAccessFile>
<RollingRandomAccessFile name="warnLog" fileName="${log.dir}/${instance}-warn.log"
filePattern="${log.dir}/%d{yyyy-MM}/${instance}-warn-%d{yyyy-MM-dd}-%i.log.gz"
append="true">
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout
pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policies>
</RollingRandomAccessFile>
<RollingRandomAccessFile name="errorLog" fileName="${log.dir}/${instance}-error.log"
filePattern="${log.dir}/%d{yyyy-MM}/${instance}-error-%d{yyyy-MM-dd}-%i.log.gz"
append="true">
<Filters>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout
pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policies>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<!-- 第三方的软件日志级别 -->
<logger name="org.springframework" level="info" additivity="true">
<AppenderRef ref="warnLog"/>
<AppenderRef ref="errorLog"/>
</logger>
<logger name="java.sql.PreparedStatement" level="debug" additivity="true">
<AppenderRef ref="Console"/>
</logger>
<!-- root logger 配置 -->
<Root level="info" includeLocation="true">
<AppenderRef ref="infoLog"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
什么是status和monitorInterval
我们看到,Configuration有2个属性status和monitorInterval,它们分别是log4j2自身组件的日志级别以及重新刷新配置文件的时间,通过配置status可以看到log4j2相关的日志,配置monitorInterval可以通过修改配置文件来改变日志配置。
log4j2的层次结构
从上面的log4j2.xml配置文件中,我们可以看到log4j2的配置文件中主要分为2块,一块为appender,描述了如何记录日志,另外一部分是log config,记录了哪种日志对应哪种级别。 而不同的LogConfig之间其实是有继承关系的,子LogConfig会继承parent的属性,而所有LogConfig都继承自Root LogConfig。所以即使只配置了root logger,你一样可以在任何地方通过LoggerFactory.getLogger获取一个logger对象,记录日志。
那么日志之间的继承关系是由什么决定的呢?看看上面的配置文件中root以外的2个logConfig,只有3个配置:日志级别,name以及appender,从直觉上看应当是name最可能决定了LogConfig的继承关系,其实也正是如此:com.foo是com.foo.Bar的父级;java是java.util的父级,是java.util.vector的祖先(注意name区分大小写)。
理解了这一点,我们就能理清log4j2配置的思路:先配置一个root,让所有需要使用日志的logger继承,然后对有特别需要的logger进行特殊的配置,比如我们希望org.springframework
包只记录error以及warn级别的log,再比如,我们希望能显示mybatis执行的sql的日志,都可以进行个性化的配置。
appender的配置
appender是LogConfig的重要组成部分,一个LogConfig可以使用多个appender,一个appender也可以被多个LogConfig使用,appender多种多样,不同的appender也有不同的属性和配置,难以一一阐述,需要使用时可以直接查看文档来进行个性化配置。不过就filters可以单独拿出来讨论一下。filter有两个重要属性onMatch
和onMismatch
。可以有DENY、ACCEPT或NEUTRAL配置,DENY说明不由当前appender处理,ACCEPT说明由当前filter处理,而NEUTRAL说明如果按顺序还有其他filter则由其他filter处理,如果当前filter已经是最后一个filter,则由当前appender处理。
异步日志
log4j2的官方文档建议记录程序行为日志异步日志,效率更高。因为异步日志使用的是无锁技术,所以需要引入Disruptor。然后可以通过配置异步的appender或Logger来实现异步日志:
<asyncRoot level="DEBUG">
<appender-ref ref="infoLog" />
<appender-ref ref="Console" />
</asyncRoot>
或
<Async name="Async">
<AppenderRef ref="infoLog"/>
</Async>
动态修改日志级别
动态修改日志级别是一个很实用的功能,关于如果动态修改日志级别,请参考美团的一篇文章:日志级别动态调整——小工具解决大问题
总结
以上就是对log4j2的配置的一些总结,更多信息请关注官方文档。