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");
我错过了什么?
答案 0 :(得分:1)
命令开关-Djava.util.logging.ConsoleHandler.level=FINE
只添加system property条目。日志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指出的一样,您将使用调整后的参数和set the system property创建一个新属性文件,以使LogManager
使用具有所需设置的新属性文件。
答案 1 :(得分:1)
要添加到 the answer by jmehrens:如果您使用的是 java-9 或更高版本,那么覆盖 LogManager
属性的更简单的方法是使用 {{ 3}} 方法。
所以在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(...)
添加新属性:只能修改现有属性。
更新:我刚刚编写了一个简单的函数,可以更轻松地对日志配置进行临时命令行更改:LogManager.updateConfiguration(mapper)