我对java.util.logging有疑问。这主要是为了理解它,因为我已经开始工作了。但我仍然不太确定为什么它有效。
所以我有一个很大很老的应用程序,有许多线程没有任何同步(不是我发明的,我只是可怜的维护者)。我将专有日志记录移植到java.util.logging。在启动时我读了一个配置文件:
String logname = Ini.getProperty("BoxLog", "boxlog.properties");
logManager = LogManager.getLogManager();
try {
logManager.readConfiguration(new FileInputStream(logname));
LOGGER.info("Read log configuration file " + logname);
} catch (SecurityException e) { ... }
我用调试器完成了它,一切都很好。没有例外,读取正确的文件,一切似乎都没问题。但是不更新日志处理程序的格式。因此,此处的日志行以系统范围配置中的默认格式输出。
由于线程很多,在另一个使用默认配置的对象中有一些日志输出,在读取配置之前输出。删除这些记录后,一切正常。
文档说明了readConfiguration():重新初始化日志记录属性并重新读取日志记录配置。所以我假设在发生这几行记录之后,然后在读取了正确的配置之后,每个进一步的记录都将采用给定的格式。但事实并非如此。任何类中的每个进一步日志记录仍然是默认格式。在我看来,在读取配置时,任何已经实例化的记录器及其处理程序都不重新初始化。
现在这是个问题。这是如何工作的?我在这里错过了什么吗?或者我在这里错误地理解了什么?或者文档中是否有错误?还有什么?
答案 0 :(得分:1)
文档说明了readConfiguration():重新初始化日志记录属性并重新读取日志记录配置。所以我假设在发现这几行记录之后,然后在读取正确的配置之后,每个进一步的记录都将采用给定的格式。
您正在加入JDK-8033661 readConfiguration does not cleanly reinitialize the logging system和JDK-5035854 LogManager.readConfiguration does not properly modify existing loggers.
通过添加LogManager.updateConfiguration(InputStream, Function<String,BiFunction<String,String,String>>)
Use of readConfiguration method in logging activities中详细介绍了这一点。
如果您无法访问JDK9,则可以使用java.util.logging.config.class
选项和java.util.logging.config.file
选项创建自定义代码,以解决上面列出的错误。
任何类中的每个进一步记录仍然是默认格式
如果您使用的是SimpleFormatter
,则会SimpleFormatter ignoring the java.util.logging.SimpleFormatter.format property。