【问题标题】:How to set java.util.logging.ConsoleHandler.level from command line arguments?如何从命令行参数设置 java.util.logging.ConsoleHandler.level?
【发布时间】:2018-03-21 18:47:42
【问题描述】:

当前默认全局日志记录级别在 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");

我错过了什么?

【问题讨论】:

  • 很明显,您并没有在命令行中过度使用日志记录,它的行为就像设置为 INFO,您说这是默认设置。
  • 是的。我无法超越我认为会发生的事情。任何线索为什么?
  • 你为什么认为你是压倒一切的?您在哪里看到这样做/记录在案的?
  • 要从命令行更改日志记录选项,请告诉 Java 加载 不同 日志记录配置文件,如 here 所示。

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


【解决方案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 使用具有您所需设置的新属性文件。

【讨论】:

    【解决方案2】:

    要添加到the answer by 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(...) 添加新属性:只能修改现有属性。

    更新:我刚刚编写了一个简单的函数,可以更轻松地对日志配置进行临时命令行更改:overrideLogLevels
    您甚至不需要包含 java-utils 作为项目的依赖项:只需在启动应用时将其添加到类路径(在 central 中可用)并定义所需的系统属性即可:

    java -cp /path/to/java-utils.jar:${CLASSPATH} \
    -Djava.util.logging.config.class=pl.morgwai.base.logging.JulConfig \
    -Djava.util.logging.overrideLevel=,java.util.logging.ConsoleHandler \
    -D.level=FINE \
    -Djava.util.logging.ConsoleHandler.level=FINE \
    ${MY_JAVA_APP_MAINCLASS_AND_ARGUMENTS}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-02
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 2019-09-20
      • 2012-02-24
      相关资源
      最近更新 更多