
log4j2的日志系统基于logger的命名层次结构。当一个logger被定义时,它会继承其父logger的配置,除非被更具体的logger配置所覆盖。例如,com.app.package.two.class7这个logger是com.app.package.two的子级,也是com.app.package的子级。这种层次结构允许我们为整个应用、特定包或特定类设置不同的日志行为。
在处理复杂的日志需求时,例如既要对整个包应用通用过滤规则,又要为包内某个特定类设置不同的过滤条件,Log4j2的这种层次性就显得尤为重要。通常,Log4j2会首先匹配最具体的Logger配置。
假设我们有以下Java项目结构:
我们的目标是实现以下日志记录条件:
RegexFilter是Log4j2提供的一种强大过滤器,它允许我们根据日志消息内容是否匹配某个正则表达式来决定是否接受(ACCEPT)或拒绝(DENY)一个日志事件。
在本教程中,我们将使用onMatch="ACCEPT"和onMismatch="DENY",这意味着只有匹配正则表达式的日志事件才会被接受并传递给Appender。正则表达式中的(?i)和(?-i)是PCRE(Perl Compatible Regular Expressions)的语法,用于在正则表达式内部开启和关闭不区分大小写匹配。
在尝试实现上述需求时,用户常遇到的问题包括:
以下是满足所有三个条件的Log4j2 XML配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="LogToConsole" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<!-- 通用包级配置:针对com.app.package及其子包的所有类 -->
<Logger name="com.app.package" level="error" additivity="false">
<RegexFilter regex=".*(?i)exception(?-i).*" onMatch="ACCEPT" onMismatch="DENY"/>
<AppenderRef ref="LogToConsole"/>
</Logger>
<!-- 特定类级配置:针对com.app.package.two.class7 -->
<!-- 此Logger会覆盖或补充其父级com.app.package的配置 -->
<Logger name="com.app.package.two.class7" level="error" additivity="false">
<RegexFilter regex=".*(?i)exception(?-i).*|.*(?i)sometext(?-i).*" onMatch="ACCEPT" onMismatch="DENY"/>
<AppenderRef ref="LogToConsole"/>
</Logger>
<Root level="info">
<AppenderRef ref="LogToConsole"/>
</Root>
</Loggers>
</Configuration>Appenders定义:
通用包级配置 (com.app.package):
特定类级配置 (com.app.package.two.class7):
Root Logger:
通过上述配置,我们成功地实现了对Log4j2日志的精细化控制,既满足了包级别的通用过滤需求,又为特定类提供了定制化的日志行为。
以上就是Log4j2高级配置:实现包级与类级日志过滤的精细化控制的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号