繁体   English   中英

更改Log4j中的优先级

[英]Change the priority level in Log4j

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

  • DEBUG <INFO <WARN <ERROR <致命

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

  • DEBUG <WARN <ERROR <INFO <致命

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

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

  1. 通过扩展org.apache.log4j.spi.Filter编写自己的自定义过滤器
  2. 覆盖决定方法
  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 for XML configurarion。 有一个关于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

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

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

    log4j.loggerFactory = com.mycompany.mypackage.MyLog4JLoggerFactory

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

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

发现了类似的问题: 是否可以使用Log4J仅记录一个级别的消息

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

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

log4j.rootLogger = FATAL,stdout,R

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

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

希望有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM