加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在少数特定情况下记录丢失的消息

发布时间:2020-12-14 06:01:05 所属栏目:Java 来源:网络整理
导读:我正在使用 java.util.logging来完成我的应用程序的所有日志记录. 直到最近,我在没有任何特定配置的情况下使用日志工具.一切都按预期工作,所有日志都在控制台中可见(stderr) 现在,我想自定义日志的配置.我希望日志显示在控制台上,但我希望它们也可以写在文件
我正在使用 java.util.logging来完成我的应用程序的所有日志记录.

直到最近,我在没有任何特定配置的情况下使用日志工具.一切都按预期工作,所有日志都在控制台中可见(stderr)

现在,我想自定义日志的配置.我希望日志显示在控制台上,但我希望它们也可以写在文件中.我提出了以下解决方案:

public static void main(String[] args) {
    System.setProperty("java.util.logging.config.file","log.config");
    Logger defLogger = Logger.getLogger("fr.def"); // all loggers I use begin by "fr.def"
    defLogger.setLevel(Level.ALL);
    defLogger.addHandler(new ConsoleHandler());
    defLogger.addHandler(new FileHandler());
    // real code here ...

以下是log.config文件的内容:

java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.FileHandler.count=10
java.util.logging.FileHandler.pattern=logs/visiodef2.%g.log

这个解决方案大部分都有效:我可以在控制台和文件中看到日志.除此之外,在某些情况下,一些日志消息只是丢失(对于控制台和文件).日志丢失的情况示例:

>在JVM的关闭挂钩上
>在默认的未捕获异常处理程序上
>在EDT的异常处理程序上
>在主JFrame的windowClosing事件上(使用默认关闭操作EXIT_ON_CLOSE配置)

除了上面描述的之外,没有其他配置.不涉及日志级别:我可以看到一些INFO日志,但有些丢失的日志是严重的.

我还尝试添加一个关闭钩子来刷新所有处理程序,但没有成功.

所以,问题是:按照我的方式配置日志记录是否安全?你能看出为什么有些日志会丢失的原因吗?

解决方法

我发现了这个问题.这很奇怪.

实际上,我的问题与日志发生在异常处理程序或Frame事件中的事实完全无关.问题是垃圾收集器在创建后几秒钟就会销毁“fr.def”记录器!因此,FileHandler也被销毁. GC可以这样做,因为LogManager只保留对它创建的Logger的弱引用.

Logger.getLogger的javadoc没有告诉任何相关内容,但是由前者调用的LogManager.addLogger的javadoc明确地说:

The application should retain its own reference to the Logger object to avoid it being garbage collected. The LogManager may only retain a weak reference.

因此,解决方法是保留对Logger.getLogger(“fr.def”)返回的对象的引用.

编辑

似乎使用弱引用的选择来自这个bug report.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读