我正在使用java.util.logging.Logger
类来登录我的应用程序。我添加了FileHandler,以便应用程序日志直接存储在log.txt文件中。
但由于某种原因,在应用程序终止后,日志远未完成。在cmd上,我可以看到所有语句,但它们永远不会附加到文件中。
我已将FileHandler设置为Logger:
private void setLogger() {
try {
FileHandler hand = new FileHandler("log/log.txt", true);
hand.setFormatter(new SimpleFormatter());
Logger log = Logger.getLogger(ImageRename.MAIN_LOG);
//log.setUseParentHandlers(false);
log.addHandler(hand);
log.setLevel(Level.ALL);
} catch (IOException e) {
System.out.println("Could Not set logger");
}
}
潮红有什么问题吗?怎么解决?感谢。
PS:在调试时,我注意到在
之间Logger.getLogger(ImageRename.MAIN_LOG).getHandlers()。长度
返回0.应该返回的位置1.最初它是打印1,但是在某处,它变为零。
答案 0 :(得分:3)
问题是...... 垃圾收集。
正在发生的事情可能如下:
Logger.getLogger(ImageRename.MAIN_LOG);
Logger.getLogger(ImageRename.MAIN_LOG);
并希望获得相同的记录器。您可以通过两种方法来避免这种情况:
logging.properties
进行配置。创建记录器时,Java日志记录API将查询配置,从而适当地重新创建它。使用静态参考。无论如何,这是最好的做法。为每个班级配备一个记录器:
private final static Logger LOG =
Logger.getLogger(ExampleClass.class.getName());
在加载类时,它不应该是垃圾收集AFAICT。
答案 1 :(得分:1)
参见例如http://www.massapi.com/class/fi/FileHandler.html示例(通过Google找到)
请注意以下行,这可能是您的问题:
fileHandler.setLevel(Level.ALL);
(注意:这是Handler
的级别,而不是Logger
或消息的级别。)
对于调试,首先尝试记录ERROR
级别的消息。默认情况下,级别INFO
及以下级别的邮件通常会被拒绝。
还尝试尽快设置日志记录级别。根据我的经验,配置Java日志记录的最可靠方法是使用属性文件,并使用以下命令调用Java:
-Djava.util.logging.config.file=path/to/file/logging.properties
原因是,一旦对日志记录进行了一些更改,您在加载设置之前, 创建的记录器有时会将 应用于 。