【问题标题】:Is it possible to suppress only Warn messages in Log4j2 while allowing all others是否可以仅禁止 Log4j2 中的警告消息而允许所有其他消息
【发布时间】:2019-05-22 07:33:03
【问题描述】:

我正在使用 log4j2 在控制台和文件中记录消息。我收到很多我不想要的警告消息。我只想看到调试和其他消息。是否可以在允许 Debug、Error 和任何其他类型的消息的同时抑制 Warn 消息?

我在这里查看了有关堆栈溢出的其他答案,但它们只讲述了抑制低于该特定消息级别的所有消息的抑制。例如,如果我将日志级别更改为错误,我将自动抑制警告调试和低于此级别的任何其他消息。我不想要这种行为。如果可能,我想禁止仅警告消息,同时允许低于和高于此级别的任何消息。下面是我的 Log2j2 配置文件。

<Configuration status="error">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n" />
        </Console>
        <File name="MyFile" fileName="logs/java.log" immediateFlush="false" append="true">
            <PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
</Configuration>

【问题讨论】:

    标签: log4j2


    【解决方案1】:

    您可以使用LevelRangeFilter 拒绝日志事件。

    这是一个生成一些日志的简单类:

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    public class SomeClass {
    
        private static final Logger log = LogManager.getLogger();   
    
        public static void main(String[] args){
    
            if(log.isDebugEnabled())
                log.debug("This is some debug!");
            log.info("Here's some info!");
            log.warn("Warning will be rejected.");
            log.error("Some error happened!");
        }
    }
    

    这是一个将所有事件发送到控制台的基本配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            </Console>
        </Appenders>
    
        <Loggers>
            <Root level="ALL">
                <AppenderRef ref="Console" />
            </Root>
        </Loggers>
    </Configuration>
    

    上面生成的输出是:

    21:08:42.215 [main] DEBUG example.SomeClass - This is some debug!
    21:08:42.217 [main] INFO  example.SomeClass - Here's some info!
    21:08:42.217 [main] WARN  example.SomeClass - Warning will be rejected.
    21:08:42.217 [main] ERROR example.SomeClass - Some error happened!
    

    现在我们将 LevelRangeFilter 添加到 Console appender:

        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            <LevelRangeFilter minLevel="WARN" maxLevel="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
        </Console>
    

    现在的输出是:

    21:15:26.987 [main] DEBUG example.SomeClass - This is some debug!
    21:15:26.989 [main] INFO  example.SomeClass - Here's some info!
    21:15:26.989 [main] ERROR example.SomeClass - Some error happened!
    

    如您所见,警告消息未记录到控制台。

    【讨论】:

      【解决方案2】:
      Try threshold filters as follows:
      
      <Configuration status="error">
          <Appenders>
              <Console name="Console" target="SYSTEM_OUT">
                <Filters>
                       <!-- Accept error and fatal messages -->
                       <ThresholdFilter level="error"  onMatch="ACCEPT"   onMismatch="NEUTRAL"/>
      
                       <!-- Reject Warn messages -->
                       <ThresholdFilter level="warn"  onMatch="DENY"   onMismatch="NEUTRAL"/>
      
                       <!-- This filter accepts debug, trace, info, error, fatal  -->
                       <ThresholdFilter level="trace"  onMatch="ACCEPT" onMismatch="DENY"/>
                  </Filters>      
                  <PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n" />
              </Console>
              <File name="MyFile" fileName="logs/java.log" immediateFlush="false" append="true">
                <Filters>
                       <!-- Accept error and fatal messages -->
                       <ThresholdFilter level="error"  onMatch="ACCEPT"   onMismatch="NEUTRAL"/>
      
                       <!-- Reject Warn messages -->
                       <ThresholdFilter level="warn"  onMatch="DENY"   onMismatch="NEUTRAL"/>
      
                       <!-- This filter accepts debug, trace, info, error, fatal  -->
                       <ThresholdFilter level="trace"  onMatch="ACCEPT" onMismatch="DENY"/>
                  </Filters>      
                  <PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n"/>
              </File>
          </Appenders>
          <Loggers>
              <Root level="debug">
                  <AppenderRef ref="Console" />
                  <AppenderRef ref="MyFile"/>
              </Root>
          </Loggers>
      </Configuration>
      

      【讨论】:

      • 非常感谢它工作得非常完美。 @Shrey
      • 您能否也解释一下它是如何工作的,以便将来我可以自己修改再次谢谢。
      猜你喜欢
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多