我希望将我的 警告、错误和信息保存在单独的文件中。所有 2 个文件都是自动创建的,但是在 info.log 中,我也看到 warnings。如何修复 log4j2.xml,以便所有三个文件,即 warn.log、info.log 和 error.log 分别包含 ONLY 警告、信息和错误?
这是 log4j2.xml 实现:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="PID">%pid</Property>
<Property name="LOG_DIRECTORY">/media/edoyou/HDD/Kanan/k2s-project/k2sbeauty/logs</Property>
<Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
<Property name="LOG_LEVEL_PATTERN">%5p</Property>
<Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
<Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}}
%clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint}
%m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
</Property>
<Property name="FILE_LOG_PATTERN">%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t]
%-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${sys:CONSOLE_LOG_PATTERN}"/>
</Console>
<RollingFile name="InfoFile" fileName="${LOG_DIRECTORY}/info.log"
filePattern="${LOG_DIRECTORY}/logs/info-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="${sys:FILE_LOG_PATTERN}"/>
<Policies>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
<Filters>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="DENY"/>
</Filters>
</RollingFile>
<RollingFile name="ErrorFile" fileName="${LOG_DIRECTORY}/error.log"
filePattern="${LOG_DIRECTORY}/logs/error-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="${sys:FILE_LOG_PATTERN}"/>
<Policies>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="DENY"/>
</Filters>
</RollingFile>
<RollingFile name="WarnFile" fileName="${LOG_DIRECTORY}/warn.log"
filePattern="${LOG_DIRECTORY}/logs/warn-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="${sys:FILE_LOG_PATTERN}"/>
<Policies>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
<Filters>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="info" onMatch="DENY" onMismatch="DENY"/>
</Filters>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="InfoFile"/>
<AppenderRef ref="WarnFile"/>
<AppenderRef ref="ErrorFile"/>
</Root>
</Loggers>
</Configuration>
过滤器可以有三个结果:
ACCEPT
- 接受消息,DENY
- 删除消息,NEUTRAL
- 继续到下一个过滤器。在您的配置中:
<Filters>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="DENY"/>
</Filters>
第一个过滤器接受至少与
INFO
一样具体的所有消息。第二个过滤器从未使用过。你想要的是:
<Filters>
<ThresholdFilter level="INFO" onMatch="NEUTRAL" onMismatch="DENY"/>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
备注:从版本 2.13.0 开始,您可以使用
LevelMatchFilter
代替整个 <Filters>
组件:
<LevelMatchFilter level="INFO"/>
RoutingAppender
来定义不带过滤器的单个附加程序,例如:
<Routing name="FILE">
<Routes pattern="$${event:Level}">
<Route>
<RollingFile name="${event:Level}File"
fileName="${LOG_DIRECTORY}/${lower:${event:Level}}.log"
filePattern="${LOG_DIRECTORY}/logs/${lower:${event:Level}}-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="${sys:FILE_LOG_PATTERN}"/>
<SizeBasedTriggeringPolicy size="10 MB"/>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Route>
</Routes>
</Routing>