[英]How to set java.util.logging.ConsoleHandler.level from command line arguments?
當前默認全局日志記錄級別在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(...)
添加新屬性:只能修改現有屬性。
更新:我剛剛編寫了一個簡單的函數來使日志配置的臨時命令行更改更容易: updateLogLevels
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.