[英]Log4j2 Filter particular level in apender
我應該使用什么過濾器來定義要使用 apender 記錄的特定級別? 例如:
爪哇:
LOGGER.debug("Debug message");
LOGGER.info("Info message");
LOGGER.warn("Warn message");
LOGGER.error("Error message");
LOGGER.fatal("Fatal message");
log4j2.xml:
<Configuration>
<Appenders>
<Console name="info-stdout-message">
<PatternLayout pattern="[%logger{36}] %message %n" />
<ThresholdFilter level="info"/>
</Console>
<Console name="detailed-stdout-message">
<PatternLayout pattern="[%logger{36}] [%level] %message %n" />
</Console>
<File name="file-appender" fileName="logs/debug.log">
<PatternLayout pattern="%d{HH:mm:ss dd.mm} [%t] [%-5level] %logger{36} - %msg %n" />
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="file-appender" level="debug" />
<AppenderRef ref="info-stdout-message" level="info"/>
<AppenderRef ref="detailed-stdout-message" level="info"/>
</Root>
</Loggers>
</Configuration>
文件輸出很好,但在控制台中我有這樣的結果:
[application.Main] [INFO] Info message
[application.Main] Info message
[application.Main] [WARN] Warn message
[application.Main] Warn message
[application.Main] [ERROR] Error message
[application.Main] Error message
[application.Main] [FATAL] Fatal message
[application.Main] Fatal message
但我需要info-stdout-message
appender 只輸出 INFO 消息,而detailed-stdout-message
輸出所有 EXEPT INFO。 所以控制台輸出應該是這樣的:
[application.Main] Info message
[application.Main] [WARN] Warn message
[application.Main] [ERROR] Error message
[application.Main] [FATAL] Fatal message
找不到如何防止過濾器尊重級別繼承。 是否有可能做到這一點?
這里有兩個控制台appender。 一個將所有跟蹤,調試和信息級別記錄到std_out,另一個將所有警告,錯誤和致命級別記錄到std_err。 這非常有用,例如在eclipse中,因為std_err顯示為紅色。
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} (%6r) %-5p [%-7t] %F:%L %x - %m%n" />
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="ACCEPT" />
</Filters>
</Console>
<Console name="STDERR" target="SYSTEM_ERR">
<PatternLayout pattern="%d{HH:mm:ss.SSS} (%6r) %-5p [%-7t] %F:%L %x - %m%n" />
<Filters>
<ThresholdFilter level="WARN" onMatch="ACCEPT" />
</Filters>
</Console>
這有效:
<Console name="info-stdout-message">
<PatternLayout pattern="[%logger{36}] %message %n" />
<Filters>
<!-- Now deny warn, error and fatal messages -->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<!-- This filter accepts info, warn, error, fatal and denies debug/trace -->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</Console>
我花了很長時間才弄清楚如何通過log4j2.xml配置文件過濾一系列LogLevels。 在最后,這對我有用:
<Filters>
<ThresholdFilter level="trace" />
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL" />
</Filters>
在這種情況下,Log4J將記錄從Level.TRACE到Level.DEBUG的所有消息,Level.DEBUG以下的所有級別都將被忽略。
請檢查https://logging.apache.org/log4j/2.0/manual/filters.html上的所有log4j2過濾可能性
示例配置片段
...
<Console name="DEFAULT" target="SYSTEM_OUT">
<PatternLayout>
<Pattern>[%d][%p][%c:%L:%M] - %m%n</Pattern>
</PatternLayout>
<Filters>
<RegexFilter regex="(?s).*(sql01|sql02|sql03).*" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
</Console>
...
實際上,從您的問題來看,您似乎不想要兩個不同的appender,而是在不同情況下使用兩種不同的模式。 為此,您應該使用PatternSelector。
<Console name="stdout-message">
<ScriptPatternSelector defaultPattern="[%logger{36}] [%level] %message %n">
<Script name="BeanShellSelector" language="bsh"><![CDATA[
if (logEvent.getLevel() == Level.INFO) {
return "INFO";
} else {
return null;
}]]>
</Script>
<PatternMatch key="INFO" pattern="[%logger{36}] %message %n"/>
</ScriptPatternSelector>
</Console>
這是 Log4j2 配置,僅忽略 docxj4 的“警告”日志。 查看下面的代碼。 提前致謝。
<configuration>
<conversionRule conversionWord="coloredLevel" converterClass="play.api.libs.logback.ColoredLevel"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>DENY</onMatch>
<onMismatch>NEUTRAL</onMismatch>
</filter>
<encoder>
<pattern>%date %coloredLevel %logger{15} - %message%n%xException{10}</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>DENY</onMatch>
<onMismatch>NEUTRAL</onMismatch>
</filter>
<file>${application.home:-.}/logs/application.log</file>
<encoder>
<pattern>%date [%level] from %logger in %thread - %message%n%xException</pattern>
</encoder>
</appender>
<logger name="org.docx4j" level="INFO"/>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
雖然所有這些解決方法在 2014 年都是必要的,但問題發布時:
在2.4版中引入了LevelRangeFilter
(參見LOG4J2-1106 ),它允許編寫:
<LevelRangeFilter minLevel="INFO" maxLevel="INFO"/>
僅選擇INFO
消息或:
<LevelRangeFilter minLevel="WARN" maxLevel="INFO"/>
選擇一個范圍(從最具體到最不具體的級別)。
版本2.13.0看到了LevelMatchFilter
的出現,進一步簡化了配置:
<LevelMatchFilter level="INFO"/>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.