我可以按照以下方式做一些事情吗:
-Djava.util.logging.loglevel=FINE
显然这行不通,但你明白了。有没有这样的东西?还是我被迫创建一个属性文件?
您甚至可以将您的日志级别作为用户定义的属性传递。
-DmyProp.logLevel=FINE
在你的代码中:
String logLevel = System.getProperties("myProp.logLevel");
但我的想法是您正在寻找更“内置”和自动处理的属性,对吗? AFAIK,它不存在,但也许我错了。
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))。因此,在覆盖全局根日志级别的情况下,在
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}
您可以配置您的代码以根据环境变量设置级别:
String sLoglevel= System.getenv("LOGLEVEL");
int ilevel = loglevel.parseInt(sLoglevel);
//set the log level based on retrieved value