Log4j2自定义日志级别过滤到不同的文件
Log4j2 custom log level filtering to different files
这是我的 log4j 属性文件
<Configuration status="WARN">
<CustomLevels>
<CustomLevel name="ANALYTICS" intLevel="50" />
</CustomLevels>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-7level %logger{36} - %msg%n"/>
</Console>
<File name="MyFile" fileName=abc.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %5p - %c - %m%n" />
</File>
<File name="analyticsFile" fileName="efg.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %5p - %c - %m%n" />
</File>
</Appenders>
<Loggers>
<Root level="TRACE">
<AppenderRef ref="MyFile" level="TRACE" />
<AppenderRef ref="analyticsFile" level="ANALYTICS" />
</Root>
</Loggers>
</Configuration>
在这里,我创建了一个自定义日志级别 (ANALYTICS = 50),其值低于 FATAL (100) 级别。有 2 个文件将收集我的所有日志。 efg.log 收集当前正在运行的所有 ANALYTICS 级别日志。 abc.log 正在收集所有日志以及分析日志。我必须避免在 abc.log 内写入分析日志。 abc.log 应该收集除 ANALYTICS 日志之外的所有日志。
需要更改什么?
阈值过滤器在这种情况下会有所帮助
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<CustomLevels>
<CustomLevel name="ANALYTICS" intLevel="50" />
</CustomLevels>
<Appenders>
<File name="ANALYTICSFILE" fileName="logs/analytics.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %5p - %c - %m%n" />
</File>
<File name="FILE" fileName="logs/app.log">
<PatternLayout pattern="%d{HH:mm:ss dd.mm} [%t] [%-5level] %logger{36} - %msg %n" />
<Filters>
<!--Deny message logged under Analytics log level-->
<ThresholdFilter level="ANALYTICS" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
</File>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="TRACE">
<AppenderRef ref="FILE" level="TRACE"/>
<AppenderRef ref="ANALYTICSFILE" level="ANALYTICS"/>
<AppenderRef ref="CONSOLE"/>
</Root>
</Loggers>
</Configuration>
这是我的 log4j 属性文件
<Configuration status="WARN">
<CustomLevels>
<CustomLevel name="ANALYTICS" intLevel="50" />
</CustomLevels>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-7level %logger{36} - %msg%n"/>
</Console>
<File name="MyFile" fileName=abc.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %5p - %c - %m%n" />
</File>
<File name="analyticsFile" fileName="efg.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %5p - %c - %m%n" />
</File>
</Appenders>
<Loggers>
<Root level="TRACE">
<AppenderRef ref="MyFile" level="TRACE" />
<AppenderRef ref="analyticsFile" level="ANALYTICS" />
</Root>
</Loggers>
</Configuration>
在这里,我创建了一个自定义日志级别 (ANALYTICS = 50),其值低于 FATAL (100) 级别。有 2 个文件将收集我的所有日志。 efg.log 收集当前正在运行的所有 ANALYTICS 级别日志。 abc.log 正在收集所有日志以及分析日志。我必须避免在 abc.log 内写入分析日志。 abc.log 应该收集除 ANALYTICS 日志之外的所有日志。
需要更改什么?
阈值过滤器在这种情况下会有所帮助
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<CustomLevels>
<CustomLevel name="ANALYTICS" intLevel="50" />
</CustomLevels>
<Appenders>
<File name="ANALYTICSFILE" fileName="logs/analytics.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %5p - %c - %m%n" />
</File>
<File name="FILE" fileName="logs/app.log">
<PatternLayout pattern="%d{HH:mm:ss dd.mm} [%t] [%-5level] %logger{36} - %msg %n" />
<Filters>
<!--Deny message logged under Analytics log level-->
<ThresholdFilter level="ANALYTICS" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
</File>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="TRACE">
<AppenderRef ref="FILE" level="TRACE"/>
<AppenderRef ref="ANALYTICSFILE" level="ANALYTICS"/>
<AppenderRef ref="CONSOLE"/>
</Root>
</Loggers>
</Configuration>