本文主要介绍log4j2的使用,分别从log4j2的层级结构、log4j2的配置-详解appender属性配置、log4j2 filter分析-含源码分析、异步日志打印等方面进行讲述。
- log4j2 配置文件层级结构
<configuration>
<appenders>
</appenders>
<loggers>
<loggers>
</configuration>
-
configuration
configuration可以带有两个参数 status,monitorInterval。status设置日志的级别,用于log4j2内部的日志输出。monitorInterval,log4j2能够自动检测配置变化,可以设置一个单位为秒的时间,表示每个多少秒,log4j2会重新加载配置文件 -
apperders
appenders可以中可以定义多个appender,每一个appender表示一份日志的输出形式,常用的有console、file、RollingFile、RandomAccessFile、RollingRandomAccessFile。
console:表示输出到控制台;
file表示输出到一个文件;
RollingFile表示可备份历史日志,可设置根据时间或者文件大小备份;
RandomAccessFile -
下面三张图主要讲解filter的调用过程:
图1
上图中只有当isFilteredByAppender(event)
的值返回false时才会调用函数tryCallAppender(event)
打印日志
图2
图2中只有当filter不为null且filter.filter(event)
的值为DENY时返回值才会为true。
图3中filters表示当前appender中具体的filter数组。这段代码可以得出一个结论,只要
Result filter(final LogEvent event)
函数返回“ACCEPT”或者“DENY”便结束循环。
图4
上图中
filter(event.getLevel())
参数是当前打印的日志级别,logger.error()打印的级别就是error。但是private Result filter(final Level level)
函数返回的是onMatch的值还是onMismatch的值,要解决这个问题,还需要看后面的代码。
图5
图6
图5、图6两张图判断当前打印日志的level(L1)的值和当前filter的level值(L2),如果L1>L2(Err>War>info>Deb,对应的值正好相反),则取filter的OnMatch值否则取OnMismatch的值。可以看出filter的匹配规则:当打印的日志级别比当前filter设置的级别高即为匹配上,解决图4遗留的问题。
网友评论