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

时间:2018-03-21 18:47:43

标签: java logging command-line java.util.logging

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

我错过了什么?

2 个答案:

答案 0 :(得分:1)

命令开关-Djava.util.logging.ConsoleHandler.level=FINE只添加system property条目。日志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指出的一样,您将使用调整后的参数和set the system property创建一个新属性文件,以使LogManager使用具有所需设置的新属性文件。

答案 1 :(得分:1)

要添加到 the answer by jmehrens:如果您使用的是 java-9 或更高版本,那么覆盖 LogManager 属性的更简单的方法是使用 {{ 3}} 方法。
所以在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(...) 添加新属性:只能修改现有属性。

更新:我刚刚编写了一个简单的函数,可以更轻松地对日志配置进行临时命令行更改:LogManager.updateConfiguration(mapper)