在Java中禁用Log4J输出


87

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

Answers:



79

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

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

5
无论如何,他都指定了“使用log4j.properties文件”。
Jaime Hablutzel 2011年

1
谢谢,正是我想要的。
Jose Martinez

以及如何将记录器恢复为以前的设置(以编程方式)?
Sachin Sharma

没有魔术,只有简单的编程。将当前级别存储在长期存在的上下文中的Map <Logger,Level>中,然后通过迭代调用e.getKey()。setLevel(e.getValue())的条目集进行还原
Andrew


14

您可以将级别更改为OFF,这将消除所有日志记录。根据log4j网站,按重要性顺序排列的有效级别为TRACE,DEBUG,INFO,WARN,ERROR,FATAL。有一个未记录的级别称为OFF,该级别比FATAL高,并且关闭所有日志记录。

您还可以创建一个额外的root记录器以不记录任何内容(级别为OFF),以便您可以轻松切换root记录器。这是一个帖子,可帮助您入门。

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


在TRACE之下是“级别” ALL,这是相反的。其次,如果程序执行类似“ if(logger.isDebugEnabled())logger.debug(...)”的操作,可能会更快
TimBüthe09年

OP没有将性能作为要关闭所有日志记录的原因。当我需要执行此操作时,这是因为许多库都遭受了某种日志记录性痢疾的折磨,这种痢疾不会产生有用的信息,因此我想以一种简便的方式来处理它。
Mark Slater

4

将级别更改为所需的级别。(我正在使用Log4j2,版本2.6.2)。这是最简单的方法,更改为<Root level="off">

例如:文件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>

4

此外,还可以通过编程方式关闭登录:

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;

1
对于不记录任何内容的独立应用程序,这是最佳解决方案。
basZero
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.