阅读量:0
文章目录
前言
- 原文
Apache Log4j 官方文档 pdf - 需求
- 将指定包目录的日志打到指定文件中
- 将
ERROR
日志单独打到指定文件中
- 目标
理解 log4j2 的架构,理解并编写配置文件,完成需求。
1. Log4j2 架构直观了解
public class MyTest { private static final Logger logger = LogManager.getLogger(); }
代码使用层面直接拿的是 Logger
,配置层面还需要关注 Appender
。
配置中的 Logger
会被以树状结构组织起来。Appender
是 Logger
连接硬件及远程服务的桥梁。Appender
与 Logger
设计层面是解耦的,使用层面需要显示关联起来。
EG:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <!-- 声明一个打印到控制台的 appender--> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <!-- 声明普通logger--> <Logger name="com.foo.Bar" level="trace"> <AppenderRef ref="Console"/> </Logger> <!-- 声明root节点 --> <Root level="error"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
2. Logger 的树状结构及 additivity
- Logger 需要在配置文件里面定义
- 官方建议使用包名作为 Logger 的 name 属性
- Logger 存在继承父类属性的能力,一路递归到 root(如图,三个Logger都会遍历到)
- 如果需要打破这种默认行为使用, 需要
additivity="false"
<Loggers> <Logger name="tech.foo" level="trace" additivity="false"> <AppenderRef ref="Console"/> </Logger> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers>
上面代码的作用:
3. Logger 的 Level 属性
官网给了一张表,描述以下的事实
4. Filter 的结构
官方文档描述了 Filter 可以用在很多地方,包括细粒度到 Appender 这层。
Filter 提供了可以细粒度操作日志打印的可能。
5. Filter 作用的规则
<!-- 需要 Filter 链的能力,必须用改标签包裹住 --> <Filters> <!-- 看源码,onMatch="NEUTRAL" onMismatch="DENY" 为 ThresholdFilter 的默认值--> <ThresholdFilter level="INFO" onMatch="NEUTRAL" onMismatch="DENY"/> <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/> </Filters>
onMatch 和 onMismatch 的含义
onMatch
日志事件准确度高于或等于 声明的 level 时触发。比如 声明为INFO,事件为ERROR。此时触发onMismatch
与onMatch
相反
取值含义
ACCEPT
放行,其他过滤器不走了DENY
拒绝并返回给调用者,其他过滤器不走了NEUTRAL
当前过滤器不处理,交给下一个过滤器,如果已经到最后一个了,放行。
上文配置的含义
比 INFO 模糊的事件都拒绝,比如 DEBUG
比 ERROR 精确(或相等)的事件都拒绝,比如 FATAL
综上,只处理 INFO 事件