当前默认全局日志记录级别在 JRE_HOME/lib/logging.properties 文件中设置为 INFO。
我从命令行运行以下命令来覆盖并将级别设置为“FINE”:
mvn test -Dtest=ABC -Djava.util.logging.ConsoleHandler.level=FINE
并且,我在代码中使用以下内容:
logger.fine("Logging works for fine");
上述消息不会打印在输出中。
如果我将其更改为以下行,则打印成功。
logger.info("Logging works for fine");
我错过了什么?
命令开关
-Djava.util.logging.ConsoleHandler.level=FINE
仅添加一个系统属性条目。日志记录 API 不会使用或读取此信息。
相反,所有日志记录属性均由 LogManager 管理。 这是一个独立的程序,向您展示
LogManager
如何更改设置:
public class LogManagerTest {
public static void main(String[] arg) throws IOException {
read(LogManager.getLogManager(), create());
Handler h = new ConsoleHandler();
System.out.println(h.getLevel());
h.close();
}
private static Properties create() {
Properties props = new Properties();
props.setProperty("java.util.logging.ConsoleHandler.level",
"FINE");
return props;
}
private static void read(LogManager manager, Properties props) throws IOException {
final ByteArrayOutputStream out = new ByteArrayOutputStream(512);
props.store(out, "No comment");
manager.readConfiguration(new ByteArrayInputStream(out.toByteArray()));
}
}
就像@Andreas 指出的那样,您将使用调整后的参数创建一个新的属性文件,并设置系统属性以使
LogManager
使用具有所需设置的新属性文件。
添加到 jmehrens 的答案:如果您使用 java-9 或更高版本,那么覆盖
LogManager
的属性的更简单方法是使用 LogManager.updateConfiguration(mapper) 方法。 ConsoleHandler
的级别:
final var propertyName = "java.util.logging.ConsoleHandler.level";
var cmdLineVal = System.getProperty(propertyName);
if (cmdLineVal != null) {
LogManager.getLogManager().updateConfiguration(
(key) -> (oldVal, newVal) ->
key.equals(propertyName) ? cmdLineVal : newVal);
}
请注意,您不能使用
updateConfiguration(...)
添加新属性:只能修改现有属性。
更新:我刚刚编写了一个简单的函数,可以更轻松地对日志记录配置进行临时命令行更改:overrideLogLevelsWithSystemProperties(还支持添加新的日志记录属性)。
您甚至不需要将包含的
jul-utils
作为项目的依赖项:只需在启动应用程序时将其添加到您的类路径(在 central 中可用)并定义所需的系统属性:
java -cp /path/to/jul-utils.jar:${CLASSPATH} \
-Djava.util.logging.config.class=pl.morgwai.base.jul.JulConfigurator \
-Djava.util.logging.overrideLevel=,java.util.logging.ConsoleHandler,com.third.party.talkative.lib \
-D.level=FINE \
-Djava.util.logging.ConsoleHandler.level=FINE \
-Dcom.third.party.talkative.lib.level=SEVERE \
${MY_JAVA_APP_MAINCLASS_AND_ARGUMENTS}