17

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

-Djava.util.logging.loglevel=FINE

显然这不起作用,但你明白了。有这样的吗?还是我被迫创建一个属性文件?

4

3 回答 3

3

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

-DmyProp.logLevel=FINE

在您的代码中:

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

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

于 2010-01-29T08:09:42.977 回答
2

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

String sLoglevel= System.getenv("LOGLEVEL");  
int ilevel = loglevel.parseInt(sLoglevel);
//set the log level based on retrieved value 
于 2010-01-29T07:32:01.470 回答
2

一般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(...)因此,在覆盖全局默认日志级别的情况下,在方法开头的某个地方使用可能是最容易的mainLogManager使用.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}
于 2021-06-11T02:01:00.047 回答