是的,我已经阅读了所有相关问题。我正在使用log4j2(尝试使用2.4版并更新到最新的2.6.2版)。
我有一个针对客户的小型实用程序。我渴望将暴露的配置保持在最低水平。但是对于有问题的情况,我还想添加-debug
标志以在运行时启用调试日志。
这是我的启用调试日志记录的代码
private static void enableDebugLogs(){
LoggerContext ctx = (LoggerContext) LogManager.getContext();
LoggerConfig log = ctx.getConfiguration().getRootLogger();
System.out.println(log.getLevel()); // INFO
log.setLevel(Level.DEBUG);
System.out.println(log.getLevel()); // DEBUG
ctx.updateLoggers();
System.out.println(ctx.getRootLogger().getLevel()); // DEBUG, hey it works, right?
}
但实际上不适用于以下任何情况:
enableDebugLogs();
logger.debug("Debug mode on"); // static, already made logger. Level did not change
LogManager.getLogger(Main.class).debug("Debug"); // Nope, not printing
Logger root = LogManager.getRootLogger();
root.info("Level: " + root.getLevel()); // Level: INFO, should be DEBUG
该实用程序通常在30秒内完成,因此更改应该是立即的。这是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} %-5level - %msg%n"/>
</Console>
<RollingFile name="File" fileName="program_name.log" filePattern="program_name-archived.log">
<PatternLayout>
<Pattern>%d{HH:mm:ss.SSS} %-5level - %msg%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10 KB" />
</Policies>
<DefaultRolloverStrategy min="1" max="1"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
使用AppenderRefs是否有问题?我能以某种方式告诉Appenders从根记录器更新记录级别吗?
最佳答案
找到了真正的问题。不得不使用:
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
代替
LoggerContext ctx = (LoggerContext) LogManager.getContext();
API指出区别在于“返回LoggerContext”和“返回当前LoggerContext”。而且我显然错过了没有布尔参数的版本的以下信息:
“警告-此方法返回的LoggerContext可能不是用于为调用类创建Logger的LoggerContext。”