我可以按照以下方式做一些事情:
-Djava.util.logging.loglevel=FINE
显然这不起作用,但你明白了。有这样的吗?还是我被迫创建一个属性文件?
我可以按照以下方式做一些事情:
-Djava.util.logging.loglevel=FINE
显然这不起作用,但你明白了。有这样的吗?还是我被迫创建一个属性文件?
您甚至可以将日志级别作为用户定义的属性传递。
-DmyProp.logLevel=FINE
在您的代码中:
String logLevel = System.getProperties("myProp.logLevel");
但我认为您正在寻找更“内置”且自动处理的属性,对吗?AFAIK,它不存在,但也许我错了。
您可以配置代码以根据环境变量设置级别:
String sLoglevel= System.getenv("LOGLEVEL");
int ilevel = loglevel.parseInt(sLoglevel);
//set the log level based on retrieved value
一般java.util.logging
不使用系统属性来配置自身(有少数例外,如java.util.logging.SimpleFormatter.format
)。相反,全局LogManager单例实例负责配置日志子系统,默认情况下它从$JAVA_HOME/conf/logging.properties
. 有几种方法可以调整这种行为:
java.util.logging.config.file
系统属性提供备用日志配置属性文件。java.util.logging.config.class
系统属性提供一个类名,该类名提供日志记录配置属性输入流。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
默认输出INFO
和更高。要更改这一点,您还需要覆盖java.util.logging.ConsoleHandler.level
日志记录配置属性。如果您想再次为此使用相同的系统属性,那么它将是这样的:
var cmdLineVal = System.getProperty("java.util.logging.loglevel");
if (cmdLineVal != null) {
LogManager.getLogManager().updateConfiguration(
(key) -> (oldVal, newVal) -> {
if (key.equals(".level")
|| key.equals(ConsoleHandler.class.getName() + ".level")) {
return cmdLineVal;
}
return newVal;
}
);
}
作为最后一点,我最近编写了一个简单的辅助函数来使对日志配置的临时命令行更改更容易:overrideLogLevels。
正如@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}