文章目录
-
- 前言
- [1. Log4j2 架构直观了解](#1. Log4j2 架构直观了解)
- [2. Logger 的树状结构及 additivity](#2. Logger 的树状结构及 additivity)
- [3. Logger 的 Level 属性](#3. Logger 的 Level 属性)
- [4. Filter 的结构](#4. Filter 的结构)
- [5. Filter 作用的规则](#5. Filter 作用的规则)
前言
- 原文
Apache Log4j 官方文档 pdf - 需求
- 将指定包目录的日志打到指定文件中
- 将
ERROR
日志单独打到指定文件中
- 目标
理解 log4j2 的架构,理解并编写配置文件,完成需求。
1. Log4j2 架构直观了解
java
public class MyTest {
private static final Logger logger = LogManager.getLogger();
}
代码使用层面直接拿的是 Logger
,配置层面还需要关注 Appender
。
配置中的 Logger
会被以树状结构组织起来。
Appender
是 Logger
连接硬件及远程服务的桥梁。
Appender
与 Logger
设计层面是解耦的,使用层面需要显示关联起来。
EG:
xml
<?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"
xml
<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 作用的规则
xml
<!-- 需要 Filter 链的能力,必须用改标签包裹住 -->
<Filters>
<!-- 看源码,onMatch="NEUTRAL" onMismatch="DENY" 为 ThresholdFilter 的默认值-->
<ThresholdFilter level="INFO" onMatch="NEUTRAL" onMismatch="DENY"/>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
注意:多个 ThresholdFilter 元素需要由 Filters 包裹,否则无法发挥Filter链条的特性
-
onMatch 和 onMismatch 的含义
onMatch
日志事件准确度高于或等于 声明的 level 时触发。比如 声明为INFO,事件为ERROR。此时触发onMismatch
与onMatch
相反
-
取值含义
ACCEPT
放行,其他过滤器不走了DENY
拒绝并返回给调用者,其他过滤器不走了NEUTRAL
当前过滤器不处理,交给下一个过滤器,如果已经到最后一个了,放行。
上文配置的含义
比 INFO 模糊的事件都拒绝,比如 DEBUG
比 ERROR 精确(或相等)的事件都拒绝,比如 FATAL
综上,只处理 INFO 事件
同理,如果只打印 ERROR 日志,可以这么写
csharp
<File name="ErrorFile" fileName="error.log">
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</File>