【问题标题】:Understanding logging了解日志记录
【发布时间】:2018-03-20 07:15:03
【问题描述】:

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

这就是问题所在。这实际上是如何工作的?我在这里错过了什么吗?还是我在这里错误地理解了什么?还是文档中有错误?或者还有什么?

【问题讨论】:

    标签: java logging java.util.logging


    【解决方案1】:

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

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

    这在JDK9中通过添加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 将涵盖这一点。

    【讨论】:

    • 谢谢。这至少澄清了这一点:)不幸的是,对于这个项目,我必须坚持使用 Java7。但既然它现在可以工作了......我只需要注意在读取配置之前不要实例化任何记录器。
    猜你喜欢
    • 2017-09-23
    • 2014-01-22
    • 2011-07-02
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2012-07-17
    相关资源
    最近更新 更多