是的,我已经阅读了所有相关问题。我正在使用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。”

09-20 22:19