【问题标题】:Change the priority level in Log4j更改 Log4j 中的优先级
【发布时间】:2011-06-10 22:37:15
【问题描述】:

Hi 通常在 Log4j 中的优先级如下

  • 调试

我们可以更改此优先级吗? 我的要求是我只需要记录优先级为 INFO 和 FATAL 的详细信息。不应记录优先级为 DEBUG、WARN 和 ERROR 的日志。如果我可以将优先级更改为

  • 调试

这是可能的。或者有没有其他方法可以做到这一点。请帮忙..

【问题讨论】:

  • 你为什么不使用 WARN 和 FATAL 或 WARN 和 ERROR?这通常是我见过的大多数项目所做的事情,而且您不必改变 log4j 的工作方式并可能让新加入该项目的人感到困惑。
  • 没有。我正在记录所有级别的消息。但在正常执行中,我只需要记录 INFO 和 FATAL。有时我需要调试应用程序。那时我将记录所有 5 级消息。我希望通过更改外部配置文件(不是用于 log4j 的配置文件)来改变我正在使用的记录器的优先级。

标签: java log4j


【解决方案1】:

Afaik,您无法在 Log4j 中更改优先级。但是你可以编写自己的记录器实现,它只记录需要的信息:

  • 写你自己的LoggerFactory/Logger
  • log4j.properties文件中指定LoggerFactory:

    log4j.loggerFactory=com.mycompany.mypackage.MyLog4JLoggerFactory

  • 在您的 Logger 实施中,忽略除 INFO 和 FATAL 错误之外的任何内容。

但是,以上可能不是最佳解决方案,因为它面向 1.2.x。也许较新版本的 log4j (SLF4J) 有更优雅的方式来实现它。

【讨论】:

    【解决方案2】:

    发现了这个类似的问题:Is it possible to log only one level messages with Log4J

    答案提示LevelMatchFilter,我不知道,但可能是您需要的。

    【讨论】:

      【解决方案3】:

      您可以通过在 log4j.properties 文件中进行一些更改来实现此目的。
      例如,您的默认级别可能是 FATAL,然后您可以为 INFO 级别指定您的包或类。

      log4j.rootLogger=致命,标准输出,R

      包日志声明:
      log4j.logger.com.xxx=信息

      类日志声明:
      log4j.logger.com.xxx.util.EmailManager=INFO

      希望对您有所帮助。

      【讨论】:

      • 这不会做他想要的。您需要阅读完整的问题
      • 我明白他在问什么,我给出的答案是记录 FATAL 和 INFO 日志语句的最简单解决方案。
      【解决方案4】:

      我从来不需要这样做,但由于我曾经阅读过Log4J - 完整手册,我希望这些指针会有所帮助。

      1. 通过扩展org.apache.log4j.spi.Filter 编写您自己的自定义过滤器
      2. 覆盖decide method
      3. 使用loggingEvent.getLevel(),识别触发的日志级别。
      4. 在决定中编写以下逻辑

        if(event.getLevel() == Level.INFO || event.getLevel() == Level.FATAL)
          return ACCEPT;
        return DENY;
        

      此过滤器将接受所有 INFO 或 FATAL 日志。你可能会更有创意。

      请注意,我没有测试过这段代码。这只是一个指南,希望对您有所帮助


      编辑:经过一番搜索,我发现了一些可能更容易的东西。我猜,你可以使用LevelMatchFilter,这样

          <filter class="org.apache.log4j.varia.LevelMatchFilter">
          <param name="LevelToMatch" value="info" />
          <param name="AcceptOnMatch" value="true" />
          </filter>
          <filter class="org.apache.log4j.varia.LevelMatchFilter">
          <param name="LevelToMatch" value="fatal" />
          <param name="AcceptOnMatch" value="true" />
          </filter>
          <filter class="org.apache.log4j.varia.DenyAllFilter"/>
      

      参考:http://wiki.apache.org/logging-log4j/Log4jXmlFormat 用于 XML 配置。 Filter Configuration上有个版块


      我不知道是什么阻止了 OP 接受这个答案。我刚刚测试过,它可以工作:

      这是 XML。

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
      
      <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="util" class="org.apache.log4j.FileAppender">
          <param name="File" value="D:/util.log" />
          <param name="Append" value="true" />
          <layout class="org.apache.log4j.PatternLayout">
              <param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/>
          </layout>           
      
          <filter class="org.apache.log4j.varia.LevelMatchFilter">
              <param name="LevelToMatch" value="info" />
              <param name="AcceptOnMatch" value="true" />
          </filter>
          <filter class="org.apache.log4j.varia.LevelMatchFilter">
              <param name="LevelToMatch" value="fatal" />
              <param name="AcceptOnMatch" value="true" />
          </filter>
          <filter class="org.apache.log4j.varia.DenyAllFilter"/>
      
        </appender> 
      
        <root> 
          <priority value ="debug" /> 
          <appender-ref ref="util" /> 
        </root>
      
      
      </log4j:configuration>
      

      这里是 Java 代码

          DOMConfigurator.configure("log4j.xml");
          Logger log = Logger.getLogger(Test.class);
          log.debug("DEBUG");
          log.info("INFO");
          log.warn("WARN");
          log.error("ERROR");
          log.fatal("FATAL");
      

      这是(按照配置)D:/util.log中的输出

      main INFO  test.Test - INFO
      main FATAL test.Test - FATAL
      

      【讨论】:

        猜你喜欢
        • 2012-02-24
        • 2014-07-23
        • 2012-03-03
        • 1970-01-01
        • 2021-03-06
        • 2023-03-06
        • 2015-05-23
        • 2016-07-21
        • 1970-01-01
        相关资源
        最近更新 更多