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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我们可以在运行时更改log4j的日志记录级别吗?相关的知识,希望对你有一定的参考价值。

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

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

请帮忙..

答案

使用所需的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

上面演示了如何更改一个名为LoggermyLogger的级别,但如果应更改当前存储库中所有记录器的级别,则应调用setLevel获取的根记录器上的Logger.getRootLogger方法以更改所有级别儿童伐木工。

另一答案

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

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

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

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

另一答案

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

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

另一答案

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

另一答案

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);

以上是关于我们可以在运行时更改log4j的日志记录级别吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在运行时更改 syslog 或 syslog-ng 日志级别吗?

log4j怎么在springmvc中使用

log4j日志基本配置

log4j

Log4J日志配置详解

Log4J日志配置详解