log4j2相对于log4j1.x有了相当大的变换,官方称相对于log4j,在多线程下高达10多倍的吞吐量。在之前的项目中一直使用的是log4j1.x,这次需要升级到log4j2,以前的自定义的日志级别如输出接口访问信息到指定文件就需要更改。

log4j2日志级别发生了变化,级别越高int值越小。详细API参考log4j2官方网站

Standard Level intLevel
OFF 0
FATAL 100
ERROR 200
WARN 300
INFO 400
DEBUG 500
TRACE 600
ALL Integer.MAX_VALUE

这次采用官方推荐的xml配置方式,log4j2自定义日志级别相对于1.x方便了很多,如自定义一个打印接口访问消耗的CONSUME级别,等级在INFOWARN之间,代码如下:

1
2
3
4
5
6
7
8
public class CustomerLog {
private static Logger logger = LogManager.getLogger(CustomerLog.class);
public final static Level CONSUME_LEVEL = Level.forName("CONSUME",350);
public static void logConsumeInfo(Object objLogInfo){
logger.log(CONSUME_LEVEL, objLogInfo);
}
}

提供一个打印接口访问消耗日志的方法,然后将通过该方法打印的日志输出到一个指定的文件中,供后续采集分析等。log4j2.xml配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<Properties>
<Property name="logFileName">../logs/consume</Property>
</Properties>
<CustomLevels>
<CustomLevel name="CONSUME" intLevel="350" />
</CustomLevels>
<RollingFile name="CONSUME" fileName="${logFileName}-consume.log" filePattern="${logFileName}-%d{yyyy-MM-dd}.log">
<LevelRangeFilter minLevel="CONSUME" maxLevel="CONSUME" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n" />
<Policies>
<!-- 每天一个文件 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
</RollingFile>
<loggers>
<AsyncRoot level="debug" includeLocation="true">
<appender-ref ref="CONSUME" level="CONSUME"/>
</AsyncRoot>
</loggers>

在xml文件中定义一个自定义级别CONSUME,这个与java代码保持一致就行。项目需求是只将CONSUME日志打印到单独文件中,所有需要配置一个LevelRangeFilter,minLevel和maxLevel值都是CONSUME,官方文档上貌似没有列出这个过滤器,我反正是没找到,确实有点坑,在翻源码的过程中发现了这个过滤器,还挺实用的。log4j2的过滤器源码都放在log4j-coreorg.apache.logging.log4j.core.filter下,还提供了一个虚拟过滤器AbstractFilter,可以继承它编写符合自己需求的过滤器。