【Log4j2】log4j-users-guide 官方文档阅读笔记

文章目录

    • 前言
    • [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
  • 需求
    1. 将指定包目录的日志打到指定文件中
    2. 将 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

  1. Logger 需要在配置文件里面定义
  2. 官方建议使用包名作为 Logger 的 name 属性
  3. Logger 存在继承父类属性的能力,一路递归到 root(如图,三个Logger都会遍历到)
  4. 如果需要打破这种默认行为使用, 需要 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>
相关推荐
知产xiao_xin6 分钟前
商标权的内容和限制
经验分享·笔记·知识产权
陈年老古董22 分钟前
Hive 函数学习笔记(上):单行函数与炸裂函数
hive·笔记·学习
喜欢打篮球的普通人1 小时前
MiniMind 学习笔记(十八):速通强化学习——从 MDP 到 PPO 的概念与算法地图
笔记·深度学习·学习
志尊宝2 小时前
Vue3 零基础每日笔记(076):防抖节流的正确使用——搜索框、按钮防重复提交、滚动监听
javascript·vue.js·笔记
海绵宝宝转agent2 小时前
2026-10-9 leetcode100刷题+面经整理
笔记·算法·面试
yi0112 小时前
DAY24: LeetCode 167:两数之和 II|从暴力枚举到左右双指针
笔记·python·算法·leetcode·二分查找·双指针
yi0113 小时前
LeetCode 15:三数之和|排序 + 双指针,如何避免重复答案?
笔记·python·算法·leetcode·双指针
北风toto3 小时前
数据库笔记:Armstrong 公理系统与集合论的深度辨析
数据库·笔记
EasyBr指纹浏览器3 小时前
我的开源项目:小红书笔记归档,把来源和缺项一起留下
笔记·小红书·开源工具·素材管理·内容归档
海海不掉头发3 小时前
图论及其应用_课堂笔记整理_CSDN博客
笔记·图论