我们可以在运行时更改log4j的日志记录级别吗?

时间:2010-12-11 06:06:23

标签: java logging log4j

我有一个问题,我想在运行时更改log4j的日志记录级别,我已经用log4j.properties文件尝试了很多东西,我也尝试编写一个代码,在特定时间后再次读取属性文件并再次配置记录器。

但问题是,我想将一个API调用的日志记录级别更改为DEBUG,然后当该调用完成后,记录器应再次更改为之前的值..

请帮助..

5 个答案:

答案 0 :(得分:19)

使用所需的Logger.setLevel调用Level方法可以在运行时更改Logger的输出级别。

以下是演示其用法的示例:

Logger logger = Logger.getLogger("myLogger");
logger.addAppender(new ConsoleAppender(new SimpleLayout()));

System.out.println("*** The current level will be INFO");

logger.setLevel(Level.INFO);
logger.warn("Only INFO and higher will appear");
logger.info("Only INFO and higher will appear");
logger.debug("Only INFO and higher will appear");

System.out.println("*** Changing level to DEBUG");

// remember the previous level
Level previousLevel = logger.getLevel();

logger.setLevel(Level.DEBUG);
logger.warn("DEBUG and higher will appear");
logger.info("DEBUG and higher will appear");
logger.debug("DEBUG and higher will appear");

System.out.println("*** Changing level back to previous level");

// revert to previous level
logger.setLevel(previousLevel);
logger.warn("Only INFO and higher will appear");
logger.info("Only INFO and higher will appear");
logger.debug("Only INFO and higher will appear");

以上输出:

*** The current level will be INFO
WARN - Only INFO and higher will appear
INFO - Only INFO and higher will appear
*** Changing level to DEBUG
WARN - DEBUG and higher will appear
INFO - DEBUG and higher will appear
DEBUG - DEBUG and higher will appear
*** Changing level back to previous level
WARN - Only INFO and higher will appear
INFO - Only INFO and higher will appear

上面演示了如何更改名为Logger的{​​{1}}的级别,但是如果应更改当前存储库中所有记录器的级别,则myLogger方法应调用Logger.getRootLogger获取的根记录器来更改所有子记录器的级别。

答案 1 :(得分:9)

如@coobird所述,可以通过调用setLevel来更改记录器的日志级别。但是,有一个问题!

当您致电getLogger(name)时,如果可能,日志记录库将返回现有的Logger对象。如果两个或多个线程请求具有相同名称的记录器,则它们将获得相同的对象。如果其中一个线程调用setLevel,则会更改所有其他线程的记录器级别。这可能会导致意外行为。

如果你真的需要做这种事情,更好的方法是为你想要在不同级别登录的情况创建一个具有不同名称的记录器。

但是,我并不相信应用程序调用{​​{1}}的智慧。 setLevel方法是关于过滤日志消息,您不应该从用户/部署者那里夺取对日志过滤的控制权。

答案 2 :(得分:1)

我认为如果服务器具有“Controller”线程,则调用setLevel是有意义的。这样,您可以在运行时动态更改日志记录级别以调试问题,并在完成后将其更改回来。

但是我不知道从一个单独的线程调用它会发生什么。

答案 3 :(得分:0)

如果您使用的是Spring Boot(1.5+),you can use logger endpoint to POST desired logging level

答案 4 :(得分:-1)

setLevel方法仅适用于java.util.logging.Logger而不适用于org.apache.logging.log4j.Logger

这是我们在apache log4j中设置日志级别的方式

org.apache.logging.log4j.core.LoggerContext
ctx = (LoggerContext) LogManager.getContext(false);
org.apache.logging.log4j.core.config.Configuration
conf = ctx.getConfiguration();
conf.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.DEBUG);
ctx.updateLoggers(conf);