更改Log4j中的优先级

时间:2011-01-18 08:08:58

标签: java log4j

嗨,通常在Log4j中,优先级如下

  • DEBUG<信息<警告<错误<致命

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

  • DEBUG<警告<错误<信息<致命

有可能。或者还有其他方法可以做到这一点。请帮助..

4 个答案:

答案 0 :(得分:26)

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

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

    if(event.getLevel() == Level.INFO || event.getLevel() == Level.FATAL)
      return ACCEPT;
    return DENY;
    
  6. 此过滤器将接受所有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
    

答案 1 :(得分:0)

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

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

    log4j.loggerFactory = com.mycompany.mypackage.MyLog4JLoggerFactory

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

log4j.rootLogger = FATAL,stdout,R

包裹日志声明:
log4j.logger.com.xxx = INFO

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

希望有所帮助。