了解记录

时间:2018-03-20 07:15:03

标签: java logging java.util.logging

我对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():重新初始化日志记录属性并重新读取日志记录配置。所以我假设在发生这几行记录之后,然后在读取了正确的配置之后,每个进一步的记录都将采用给定的格式。但事实并非如此。任何类中的每个进一步日志记录仍然是默认格式。在我看来,在读取配置时,任何已经实例化的记录器及其处理程序都重新初始化。

现在这是个问题。这是如何工作的?我在这里错过了什么吗?或者我在这里错误地理解了什么?或者文档中是否有错误?还有什么?

1 个答案:

答案 0 :(得分:1)

  

文档说明了readConfiguration():重新初始化日志记录属性并重新读取日志记录配置。所以我假设在发现这几行记录之后,然后在读取正确的配置之后,每个进一步的记录都将采用给定的格式。

您正在加入JDK-8033661 readConfiguration does not cleanly reinitialize the logging systemJDK-5035854 LogManager.readConfiguration does not properly modify existing loggers.

通过添加LogManager.updateConfiguration​(InputStream, Function<String,BiFunction<String,String,String>>)

在JDK9中解决了这个问题

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