我试图在运行时设置 java util 日志记录配置文件,以避免将其设置为 VM 参数。但这只是行不通。每当我尝试重新读取配置时,日志记录都会被完全禁用。
请参阅以下代码片段:
package test;
import java.io.FileInputStream;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class A {
private static final Logger LOGGER= Logger.getLogger(A.class.getName());
public static void main(String[] args) throws Exception {
System.out.println("--- start");
LOGGER.log(Level.SEVERE, "SEVERE 1");
LOGGER.log(Level.FINEST, "FINEST 1");
LogManager.getLogManager().readConfiguration();
LOGGER.log(Level.SEVERE, "SEVERE 2");
LOGGER.log(Level.FINEST, "FINEST 2");
LogManager.getLogManager().readConfiguration(new FileInputStream("/tmp/logging.properties"));
LOGGER.log(Level.SEVERE, "SEVERE 3");
LOGGER.log(Level.FINEST, "FINEST 3");
System.out.println("--- end");
}
}
如果我在没有任何 VM 参数的情况下运行该类,这是输出:
--- start
09.11.2012 09:59:25 test.A main
SCHWERWIEGEND: SEVERE 1
09.11.2012 09:59:25 test.A main
SCHWERWIEGEND: SEVERE 2
--- end
如您所见,仅记录 SEVERE 级别,因为这是 JRE logging.properties 的默认设置。打电话LogManager#readConfiguration()
不会改变任何事情。但是当试图从我的 logging.properties 中读取配置时,绝对没有记录任何内容。LogManager#readConfiguration(InputStream)
调用或设置java.util.logging.config.file
属性和调用没有区别LogManager#readConfiguration()
。
现在看到下一个输出,当我使用 VM 属性运行相同的代码时-Djava.util.logging.config.file=/tmp/logging.properties
:
--- start
2012-11-09 10:03:44.0838 SEVERE [test.A#main()] - SEVERE 1
2012-11-09 10:03:44.0843 FINEST [test.A#main()] - FINEST 1
--- end
如您所见,SEVERE 和 FINEST 级别都被记录,并且它们以不同的格式记录。两者都在我的 custom 中指定logging.properties
。但是调用后记录在这里停止LogManager#readConfiguration()
!这与上面的示例不同,我不明白。此外,就像上面的示例一样,调用LogManager#readConfiguration(InputStream)
不起作用。
那么问题是什么?根据javadoc设置,运行时 java.util.logging.config.file 属性应该可以工作。两个 readConfiguration() 方法也应该像我预期的那样工作。那么问题是什么?