java Log4j2过滤器中的特定水平

qgelzfjb  于 2022-12-17  发布在  Java
关注(0)|答案(7)|浏览(114)

我应该使用什么过滤器来定义要用apender记录的特定级别?例如:
java :

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

找不到如何防止筛选器的相关级别继承。是否可以执行此操作?

9ceoxa92

9ceoxa921#

这里有两个控制台附加器。一个将所有跟踪、调试和信息级别记录到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>
rqenqsqc

rqenqsqc2#

这是可行的:

<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>
deyfvvtc

deyfvvtc3#

我花了很长时间才弄明白如何通过log4j2.xml配置文件过滤一系列LogLevel。最后,这对我很有效:

<Filters>
    <ThresholdFilter level="trace" />
    <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL" />
</Filters>

在这种情况下,Log4J将记录从Level.TRACE到Level.DEBUG的所有消息,Level.DEBUG以下的所有级别都将被忽略。

c2e8gylq

c2e8gylq4#

请检查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>
...
8wigbo56

8wigbo565#

实际上,从你的问题来看,你并不需要两个不同的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>
gj3fmq9x

gj3fmq9x6#

这里的代码为我工作。我只忽略了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>
zvms9eto

zvms9eto7#

虽然所有这些变通方案在2014年都是必要的,但当问题发布时:

  • 在版本2.4中引入了LevelRangeFilter(参见LOG4J2-1106),它允许写入:
<LevelRangeFilter minLevel="INFO" maxLevel="INFO"/>

仅选择INFO消息或:

<LevelRangeFilter minLevel="WARN" maxLevel="INFO"/>

选择一个范围(从最高到最低的具体水平)。

  • 版本2.13.0中出现了LevelMatchFilter,进一步简化了配置:
<LevelMatchFilter level="INFO"/>

相关问题