【问题标题】:Disabling Log4J Output in Java在 Java 中禁用 Log4J 输出
【发布时间】:2010-10-08 23:43:24
【问题描述】:

如何使用log4j.properties 文件快速关闭所有Log4J 输出?

【问题讨论】:

    标签: java logging log4j


    【解决方案1】:

    将级别设置为关闭 (而不是 DEBUG、INFO、....)

    【讨论】:

      【解决方案2】:

      您可以将级别更改为关闭,这应该会删除所有日志记录。根据 log4j 网站,有效级别按重要性顺序为 TRACE、DEBUG、INFO、WARN、ERROR、FATAL。有one undocumented level 称为OFF,比FATAL 级别高,关闭所有日志记录。

      您还可以创建一个额外的根记录器以不记录任何内容(级别关闭),以便您可以轻松切换根记录器。 Here's a post 让您开始。

      您可能还想阅读Log4J FAQ,,因为我认为关闭所有日志记录可能无济于事。它肯定不会使您的应用程序加速那么多,因为无论如何都会执行日志记录代码,直到 log4j 决定它不需要记录此条目。

      【讨论】:

      • TRACE 下方是“级别”ALL,与之相反。其次,如果程序执行“if(logger.isDebugEnabled()) logger.debug(...)”之类的操作可能会更快
      • OP 没有提到性能是想要关闭所有日志记录的原因。当我需要这样做时,是因为许多图书馆都患有一种日志记录痢疾,它不会产生任何有用的信息,我想要一种简单的方法来处理它。
      【解决方案3】:
       log4j.rootLogger=OFF
      

      【讨论】:

        【解决方案4】:

        如果您想以编程方式关闭日志记录,请使用

        List<Logger> loggers = Collections.<Logger>list(LogManager.getCurrentLoggers());
        loggers.add(LogManager.getRootLogger());
        for ( Logger logger : loggers ) {
            logger.setLevel(Level.OFF);
        }
        

        【讨论】:

        • 他指定“使用 log4j.properties 文件”无论如何它非常有用。
        • 你如何将记录器恢复到以前的设置(以编程方式)?
        • 没有魔法,只是简单的编程。将当前级别存储在长期上下文中的 Map 中,然后通过迭代调用 e.getKey().setLevel(e.getValue()) 的条目集来恢复
        • 这现在不起作用,因为 LogManager 不存在
        【解决方案5】:

        将级别更改为您想要的。 (我使用的是 Log4j2,版本 2.6.2)。这是最简单的方法,改成&lt;Root level="off"&gt;

        例如:文件log4j2.xml
        开发环境

        <?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>
                <Console name="SimpleConsole" target="SYSTEM_OUT">
                    <PatternLayout pattern="%msg%n"/>
                </Console>
            </Appenders>
            <Loggers>
                <Root level="error">
                    <AppenderRef ref="Console"/>
                </Root>
            </Loggers>
            <Loggers>
                <Root level="info">
                    <AppenderRef ref="SimpleConsole"/>
                </Root>
            </Loggers>
        </Configuration>
        

        生产环境

        <?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>
                <Console name="SimpleConsole" target="SYSTEM_OUT">
                    <PatternLayout pattern="%msg%n"/>
                </Console>
            </Appenders>
            <Loggers>
                <Root level="off">
                    <AppenderRef ref="Console"/>
                </Root>
            </Loggers>
            <Loggers>
                <Root level="off">
                    <AppenderRef ref="SimpleConsole"/>
                </Root>
            </Loggers>
        </Configuration>
        

        【讨论】:

          【解决方案6】:

          此外,还可以通过编程方式关闭注销:

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

          或者

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

          这些使用导入:

          import org.apache.log4j.Logger;
          import org.apache.log4j.Level;
          import org.apache.log4j.NullAppender;
          

          【讨论】:

          • 这是不应该记录任何内容的独立应用程序的最佳解决方案。
          猜你喜欢
          • 1970-01-01
          • 2012-08-04
          • 1970-01-01
          • 1970-01-01
          • 2016-06-05
          • 2014-08-13
          • 1970-01-01
          • 2023-03-10
          • 1970-01-01
          相关资源
          最近更新 更多