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

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

我可以按照以下方式做一些事情吗:

-Djava.util.logging.loglevel=FINE

显然这行不通,但你明白了。有没有这样的东西?还是我被迫创建一个属性文件?

java logging java.util.logging
3个回答
3
投票

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

-DmyProp.logLevel=FINE

在你的代码中:

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

但我的想法是您正在寻找更“内置”和自动处理的属性,对吗? AFAIK,它不存在,但也许我错了。


3
投票

tldr:
把这段代码放在你的

main
方法的开头:

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

如果无法修改

main
的解释和解决方法:

一般

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

  • 提供
    java.util.logging.config.file
    系统属性,其中包含指向备用日志记录配置属性文件的路径。
  • java.util.logging.config.class
    系统属性提供一个完全覆盖配置过程的类名(通常通过提供自定义
    InputStream
    并将配置属性记录到 readConfiguration(is))。
  • 使用 LogManager.updateConfiguration(mapper) 方法(java 9+)仅覆盖选定的属性。请注意,此方法只能覆盖现有属性,而不能添加新属性(为此,需要使用更繁琐的 updateConfiguration(inputStream, mapper) 方法)。

因此,在覆盖全局根日志级别的情况下,在

updateConfiguration(mapper)
方法开头的某个地方使用
main
可能是最简单的。
LogManager
使用
.level
属性(“根”记录器的级别)作为其所有子记录器的默认值,因此使用 OP 中的
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 默认输出
INFO
和更高版本。要更改此设置,您还需要覆盖
java.util.logging.ConsoleHandler.level
日志记录配置属性。如果你想再次使用相同的系统属性,那么你需要像下面这样修改
updateConfiguration
的参数:

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

作为最后的说明,我最近编写了一个简单的辅助函数来更轻松地对日志配置进行临时命令行更改:overrideLogLevelsWithSystemProperties.
正如@TWiStErRob 在评论 中提到的那样,您甚至不需要将包含

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}

2
投票

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

String sLoglevel= System.getenv("LOGLEVEL");  
int ilevel = loglevel.parseInt(sLoglevel);
//set the log level based on retrieved value 
© www.soinside.com 2019 - 2024. All rights reserved.