以编程方式更改Log4j2中的日志级别

我有兴趣以编程方式更改Log4j2中的日志级别。 我试图看看他们的configuration文件,但似乎没有任何东西。 我也尝试在包中查找: org.apache.logging.log4j.core.config ,但没有在那里看起来有帮助。

编辑根据log4j2版本2.4常见问题

您可以使用Log4j Core的Configurator类设置logging器的级别。 但请注意,configuration器类不是公共API的一部分。

 // org.apache.logging.log4j.core.config.Configurator; Configurator.setLevel("com.example.Foo", Level.DEBUG); // You can also set the root logger: Configurator.setRootLevel(Level.DEBUG); 

资源

编辑以反映Log4j2版本2.0.2中引入的API的变化

如果您想更改根logging器级别,请执行如下操作:

 LoggerContext ctx = (LoggerContext) LogManager.getContext(false); Configuration config = ctx.getConfiguration(); LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME); loggerConfig.setLevel(level); ctx.updateLoggers(); // This causes all Loggers to refetch information from their LoggerConfig. 

这里是LoggerConfig的javadoc。

如果您想更改一个特定的logging器级别(不是在configuration文件中configuration的根logging器或logging器),可以这样做:

 public static void setLevel(Logger logger, Level level) { final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); final Configuration config = ctx.getConfiguration(); LoggerConfig loggerConfig = config.getLoggerConfig(logger.getName()); LoggerConfig specificConfig = loggerConfig; // We need a specific configuration for this logger, // otherwise we would change the level of all other loggers // having the original configuration as parent as well if (!loggerConfig.getName().equals(logger.getName())) { specificConfig = new LoggerConfig(logger.getName(), level, true); specificConfig.setParent(loggerConfig); config.addLogger(logger.getName(), specificConfig); } specificConfig.setLevel(level); ctx.updateLoggers(); } 

我在这里find了一个很好的答案: https : //garygregory.wordpress.com/2016/01/11/changing-log-levels-in-log4j2/

您可以使用org.apache.logging.log4j.core.config.Configurator来设置特定logging器的级别。

 Logger logger = LogManager.getLogger(Test.class); Configurator.setLevel(logger.getName(), Level.DEBUG); 

程序化的方法是相当侵入性的。 也许你应该检查Log4J2提供的JMX支持:

  1. 启动应用程序中的JMX端口:

    -Dcom.sun.management.jmxremote.port = [port_num]

  2. 在执行应用程序时使用任何可用的JMX客户端(JVM在JAVA_HOME / bin / jconsole.exe中提供一个)。

  3. 在JConsole中查找“org.apache.logging.log4j2.Loggers”bean

  4. 最后改变你的logging器的水平

我最喜欢的东西就是你不需要修改你的代码或configuration来pipe理它。 这一切都是外在的,透明的。

更多信息: http : //logging.apache.org/log4j/2.x/manual/jmx.html

由@slaadvak接受的答案没有为我工作Log4j2 2.8.2 。 以下做了。

要更改日志Level 通用

 Configurator.setAllLevels(LogManager.getRootLogger().getName(), level); 

要仅更改当前class级的日志Level ,请使用:

 Configurator.setLevel(LogManager.getLogger(CallingClass.class).getName(), level); 

一个不寻常的方式,我发现要做的是创build两个不同的日志logging级别单独的文件。
例如。 log4j2.xml和log4j-debug.xml现在从这些文件中更改configuration。
示例代码:

 ConfigurationFactory configFactory = XmlConfigurationFactory.getInstance(); ConfigurationFactory.setConfigurationFactory(configFactory); LoggerContext ctx = (LoggerContext) LogManager.getContext(false); ClassLoader classloader = Thread.currentThread().getContextClassLoader(); InputStream inputStream = classloader.getResourceAsStream(logFileName); ConfigurationSource configurationSource = new ConfigurationSource(inputStream); ctx.start(configFactory.getConfiguration(ctx, configurationSource));