【问题标题】:How to disable log4j logging from Java code如何从 Java 代码禁用 log4j 日志记录
【发布时间】:2012-01-03 07:56:39
【问题描述】:

我使用一个使用 log4j 写入日志的遗留库。我的默认 log4j.properties 文件将日志定向到控制台,但在我的主程序的某些特定功能中,我想完全禁用日志记录(来自所有类)。

我试过了:

Logger.getLogger(BasicImplementation.class.getName()).setLevel(Level.OFF);

其中“BasicImplementation”是记录日志的主要类之一,但它不起作用 - 日志仍会写入控制台。

这是我的 log4j.properties:

log4j.rootLogger=warn, stdout
log4j.logger.ac.biu.nlp.nlp.engineml=info, logfile
log4j.logger.org.BIU.utils.logging.ExperimentLogger=warn

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-5p %d{HH:mm:ss} [%t]: %m%n

log4j.appender.logfile = ac.biu.nlp.nlp.log.BackupOlderFileAppender
log4j.appender.logfile.append=false
log4j.appender.logfile.layout = org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern = %-5p %d{HH:mm:ss} [%t]: %m%n
log4j.appender.logfile.File = logfile.log

【问题讨论】:

  • 您可能必须禁用根记录器,但请先发布您的log4j.properties/log4j.xml

标签: java log4j


【解决方案1】:

所以,您定义了 3 个记录器,包括根:

log4j.rootLogger=warn, stdout
log4j.logger.ac.biu.nlp.nlp.engineml=info, logfile
log4j.logger.org.BIU.utils.logging.ExperimentLogger=warn

不幸的是,要以编程方式禁用它们,您需要在代码中指定所有这些:

Logger.getLogger("ac.biu.nlp.nlp.engineml").setLevel(Level.OFF);
Logger.getLogger("org.BIU.utils.logging.ExperimentLogger").setLevel(Level.OFF);
Logger.getRootLogger().setLevel(Level.OFF);

Here's 如何将其重置为配置文件中设置的内容。

【讨论】:

    【解决方案2】:

    如果您想实现完全静音(例如安静的命令行工具),您可以随时使用NullAppender

    Logger.getRootLogger().removeAllAppenders();
    Logger.getRootLogger().addAppender(new NullAppender());
    

    【讨论】:

      【解决方案3】:

      你可以使用

      Logger.getRootLogger().setLevel(Level.OFF); 
      

      禁用 java 代码中的任何日志记录

      【讨论】:

        【解决方案4】:

        在 java.util.logging.Logger 1.8 版中,正确的格式是:

        Logger.getLogger("").setLevel(Level.OFF);

        【讨论】:

          【解决方案5】:

          大概是这样的:

          Logger.getRootLogger().shutdown();

          【讨论】:

            【解决方案6】:

            对于较新的 log4j 版本,您可以考虑调用:

            LogManager.shutdown();

            代替:

            Logger.shutdown();

            已弃用。但它仍然做同样的事情:

            调用此方法将安全地关闭并删除所有类别中的所有附加程序,包括默认层次结构中包含的根。

            【讨论】:

              【解决方案7】:

              您可以尝试通过更改 log4j.properties 来禁用它:

              log4j.rootLogger=off, stdout
              #log4j.logger.ac.biu.nlp.nlp.engineml=info, logfile
              #log4j.logger.org.BIU.utils.logging.ExperimentLogger=warn
              
              ...
              

              参考: http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Level.html#OFF

              【讨论】:

                【解决方案8】:

                将以下内容添加到您的日志文件中

                log4j.logger.com.class.with.package.BasicImplementation = off, logfiledata
                
                log4j.appender.logfiledata = ac.biu.nlp.nlp.log.BackupOlderFileAppender
                log4j.appender.logfiledata.append=false
                log4j.appender.logfiledata.layout = org.apache.log4j.PatternLayout
                log4j.appender.logfiledata.layout.ConversionPattern = %-5p %d{HH:mm:ss} [%t]: %m%n
                log4j.appender.logfiledata.File = logfiledata.log
                

                如果上述内容不会停止记录,它至少会将 BasicImplementation 类中的所有数据记录到单独的文件中。

                【讨论】:

                  猜你喜欢
                  • 2017-07-09
                  • 1970-01-01
                  • 2011-06-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-01-08
                  • 1970-01-01
                  • 2010-09-07
                  相关资源
                  最近更新 更多