Log4j2 配置文件及描述
前面介绍Java Log的总体情况,以及两个日志框架和具体日志实现框架间的桥接。本章主要介绍日常工作中用的比较多的Log4j2的配置信息以及解释。
1. 配置文件解析
1. 同步模式
1 |
|
2. 全异步模式
- 只需要将系统属性
Log4jContextSelector
设置为AsyncLoggerContextSelector
- 在配置属性文件
log4j2.component.properties
中配置Log4jContextSelector
为AsyncLoggerContextSelector
3.混合模式
todo 修改
不需要改系统属性或者引入属性配置文件,只需要将相应的Loger
换成AsyncLoger
。
1 | <logers> |
##2. 同步、异步以及混合模式的比较
虽然异步日志有很大的优势,但是它并不是适合于所有应用场景。如下将通过分析异步日志的优劣来比较同步日志和异步日志:
优势
- 更高的峰值吞吐量,相同场景下,异步日志的能打印的日志量是同步的6-58倍
- 更快的响应时间,调用后立即返回,而不用等到appender执行完成。
缺点
- 错误处理方便,如果在打印日志的过程中抛了异常,对于异步日志来说很难记录。即使通过ExceptionHander可以减轻这种情况,但是并不能解决所有的情况。因此,当日志是业务逻辑的一部分(比如讲Log4j作为审计日志框架)时,则推荐使用同步日志;
- 在某些极端的情况下,打印的日志对象,可能会有变化。如:
MapMessage
、StructuredDataMessage
,用户有可能会看到非触发打印时的对象快照 - 如果应用CPU资源吃紧的话,不适合于异步。因为它的速度是以牺牲CPU为代价的。
- 当应用打日志的速率比底层追加器的最大速率都要快,最后队列会被打满,最终也会以最慢追加器的速率打日志
主要工作流程:
- LogManager.getLogger(xx.class) 会根据class文件的具体类名来获取最匹配的LogConfig
- 会遍历所有Appender,打印日志;
- 当LoggerConfig配置了additivity=”true” 会将日志事件传递给父节点LoggerConfig
LogerConfig会根据name来建立一个关系树,root是根节点。如下图:
additivity(是否可叠加) 用于控制:子LogConfig里的日志事件是否往父LogConfig中传递。
3. LogConfig继承关系图
参考: