bar*_*jak 6 java logging exception-handling
我正在使用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 ...
Run Code Online (Sandbox Code Playgroud)
这是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
Run Code Online (Sandbox Code Playgroud)
这个解决方案大部分都有效:我可以在控制台和文件中看到日志.除此之外,在某些情况下,一些日志消息只是丢失(对于控制台和文件).日志丢失的情况示例:
除了上面描述的之外,没有其他配置.不涉及日志级别:我可以看到一些INFO日志,但有些丢失的日志是严重的.
我还尝试添加一个关闭钩子来刷新所有处理程序,但没有成功.
所以,问题是:按照我的方式配置日志记录是否安全?你能看出为什么有些日志会丢失的原因吗?
我发现了这个问题.这很奇怪.
实际上,我的问题与日志发生在异常处理程序或Frame事件中的事实完全无关.问题是垃圾收集器在创建后几秒钟就会销毁"fr.def"记录器!因此,FileHandler也被销毁.GC可以这样做,因为LogManager只保留对它创建的Logger的弱引用.
javadoc Logger.getLogger并没有说明任何内容,但是LogManager.addLogger前者调用的javadoc 明确地说:
应用程序应保留自己对Logger对象的引用,以避免被垃圾回收.LogManager可能只保留弱引用.
因此,解决方法是保持对返回的对象的引用Logger.getLogger("fr.def").
似乎使用弱引用的选择来自此错误报告.
| 归档时间: |
|
| 查看次数: |
1184 次 |
| 最近记录: |