如何从命令行参数设置 java.util.logging.ConsoleHandler.level?

问题描述 投票:0回答:2

当前默认全局日志记录级别在 JRE_HOME/lib/logging.properties 文件中设置为 INFO

我从命令行运行以下命令来覆盖并将级别设置为“FINE”:

mvn test -Dtest=ABC -Djava.util.logging.ConsoleHandler.level=FINE

并且,我在代码中使用以下内容:

logger.fine("Logging works for fine");

上述消息不会打印在输出中。

如果我将其更改为以下行,则打印成功。

logger.info("Logging works for fine");

我错过了什么?

java logging command-line java.util.logging
2个回答
2
投票

命令开关

-Djava.util.logging.ConsoleHandler.level=FINE
仅添加一个系统属性条目。日志记录 API 不会使用或读取此信息。

相反,所有日志记录属性均由 LogManager 管理。 这是一个独立的程序,向您展示

LogManager
如何更改设置:

public class LogManagerTest {

    public static void main(String[] arg) throws IOException {
        read(LogManager.getLogManager(), create());
        Handler h = new ConsoleHandler();
        System.out.println(h.getLevel());
        h.close();
    }

    private static Properties create() {
        Properties props = new Properties();
        props.setProperty("java.util.logging.ConsoleHandler.level", 
                "FINE");
        return props;
    }

    private static void read(LogManager manager, Properties props) throws IOException {
        final ByteArrayOutputStream out = new ByteArrayOutputStream(512);
        props.store(out, "No comment");
        manager.readConfiguration(new ByteArrayInputStream(out.toByteArray()));
    }
}

就像@Andreas 指出的那样,您将使用调整后的参数创建一个新的属性文件,并设置系统属性以使

LogManager
使用具有所需设置的新属性文件。


2
投票

添加到 jmehrens 的答案:如果您使用 java-9 或更高版本,那么覆盖

LogManager
的属性的更简单方法是使用 LogManager.updateConfiguration(mapper) 方法。
所以对于
ConsoleHandler
的级别:

final var propertyName = "java.util.logging.ConsoleHandler.level";
var cmdLineVal = System.getProperty(propertyName);
if (cmdLineVal != null) {
    LogManager.getLogManager().updateConfiguration(
            (key) -> (oldVal, newVal) ->
                    key.equals(propertyName) ? cmdLineVal : newVal);
}

请注意,您不能使用

updateConfiguration(...)
添加新属性:只能修改现有属性。

更新:我刚刚编写了一个简单的函数,可以更轻松地对日志记录配置进行临时命令行更改:overrideLogLevelsWithSystemProperties(还支持添加新的日志记录属性)。
您甚至不需要将包含的

jul-utils
作为项目的依赖项:只需在启动应用程序时将其添加到您的类路径(在 central 中可用)并定义所需的系统属性:

java -cp /path/to/jul-utils.jar:${CLASSPATH} \
-Djava.util.logging.config.class=pl.morgwai.base.jul.JulConfigurator \
-Djava.util.logging.overrideLevel=,java.util.logging.ConsoleHandler,com.third.party.talkative.lib \
-D.level=FINE \
-Djava.util.logging.ConsoleHandler.level=FINE \
-Dcom.third.party.talkative.lib.level=SEVERE \
${MY_JAVA_APP_MAINCLASS_AND_ARGUMENTS}
© www.soinside.com 2019 - 2024. All rights reserved.