是否有用于在Java中设置默认日志级别的命令行选项

时间:2010-01-29 07:16:11

标签: java logging

我可以按照以下方式做点什么:

-Djava.util.logging.loglevel=FINE

显然这不起作用,但你明白了。有什么相似的吗?或者我被迫创建属性文件?

3 个答案:

答案 0 :(得分:4)

您甚至可以将日志级别作为用户定义的属性传递。

-DmyProp.logLevel=FINE

在您的代码中:

String logLevel = System.getProperties("myProp.logLevel");

但我知道你正在寻找一个更“内置”和自动处理的财产,对吧? AFAIK,它不存在,但也许我错了。

答案 1 :(得分:1)

您可以配置代码以根据环境变量设置级别:

String sLoglevel= System.getenv("LOGLEVEL");  
int ilevel = loglevel.parseInt(sLoglevel);
//set the log level based on retrieved value 

答案 2 :(得分:0)

通常 java.util.logging 不使用系统属性来配置自身(很少有例外,例如 java.util.logging.SimpleFormatter.format)。相反,全局 LogManager 单例实例负责配置日志子系统,默认情况下它从 $JAVA_HOME/conf/logging.properties 加载属性。有几种方法可以调整此行为:

  • 提供带有备用日志配置属性文件的 java.util.logging.config.file 系统属性。
  • 提供带有类名的 java.util.logging.config.class 系统属性,该类名提供日志配置属性输入流。
  • 使用 LogManager.updateConfiguration(mapper) 方法 (java 9+) 仅覆盖选定的属性。请注意,此方法只能覆盖现有属性,不能添加新属性。

因此,在覆盖全局默认日志级别的情况下,在 updateConfiguration(...) 方法的开头使用 main 可能是最简单的。 LogManager 使用 .level 属性(“根”记录器的级别)作为其所有子记录器的默认值,因此使用示例中的 java.util.logging.loglevel 系统属性,它会是这样的:

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

请注意,在默认日志配置的情况下,上述内容不足以在控制台上输出任何 FINE(或更低)日志条目,因为 ConsoleHandler 默认输出 {{1 }} 和更高。要更改此设置,您还需要覆盖 INFO 日志记录配置属性。如果您想再次为此使用相同的系统属性,则如下所示:

java.util.logging.ConsoleHandler.level

最后要注意的是,我最近编写了一个简单的辅助函数,可以更轻松地对日志配置进行临时命令行更改:updateLogLevels