2012-09-05 55 views
1

我正在使用java.util.logging.Logger类登录我的应用程序。我添加了FileHandler,以便应用程序日志直接存储在log.txt文件中。记录器无法正常工作

但由于某种原因,应用程序终止后,日志远未完成。在cmd上,我可以看到所有的语句,但它们从不附加到文件中。

我已经设置的FileHandler到记录仪:

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

我认为处理日志的最好方法之一是使用[Apache log4j](http://logging.apache.org/log4j/1.2/)。这是一个易于使用和高度可定制的Java日志框架 – Sujay

+1

避免库膨胀。我认为log4j与* current * Java日志(在Java 1.4中引入)相比几乎没有什么好处。 –

+0

尝试以最高优先级进行日志记录,并尝试为*处理程序*设置一个级别。可能您的处理程序没有设置为在此级别登录。 –

回答

3

问题是...... 垃圾回收

正在发生的事情很可能是以下几点:

  1. 你叫Logger.getLogger(ImageRename.MAIN_LOG);
  2. 您设置的记录。
  3. Java通知它未被引用,并放弃它。
  4. 你打电话Logger.getLogger(ImageRename.MAIN_LOG);,并期望得到相同的记录器。
  5. A 新鲜记录仪设置为默认配置。

您可以通过两种措施避免这种情况:

  • 使用配置文件logging.properties进行配置。创建记录器时,Java记录API将查询配置,并因此适当地重新创建它。
  • 使用静态引用。无论如何,这是最佳做法。虽然类加载它,然后不应该被垃圾收集AFAICT

    private final static Logger LOG = 
        Logger.getLogger(ExampleClass.class.getName()); 
    

:装备每类的记录器。

1

参见例如http://www.massapi.com/class/fi/FileHandler.html为例(通过谷歌找到)

注意以下行,这可能是你的问题:

fileHandler.setLevel(Level.ALL); 

(注:这是不是Logger或消息Handler的水平,)

对于调试,首先尝试获取记录的ERROR级别的消息。级别为INFO及以下的消息通常在默认情况下被抑制。

也尝试尽快设置日志记录级别。根据我的经验,配置Java记录的最可靠的方法是通过使用属性文件,并调用java有:

-Djava.util.logging.config.file=path/to/file/logging.properties 

的原因是,你做的设置有时是应用到记录器之前创建一旦对日志记录进行了一些更改,您就会加载设置。

+0

我所有的日志都是Info级别的。你可以请你的意思是“INFO级以下的消息通常是默认压制的。” – Jatin

+0

使用属性文件配置记录器的+1。此外,我会建议使用预定义的级别而不是“全部”。在这种情况下,设置'Level.FINE'甚至'Level.FINEST'会有帮助 – Sujay

+0

对不起,我认为默认级别只记录* INFO以上*,但据我所知它是开始记录在'INFO'本身。那么你应该看到他们。无论如何,请尝试更高级别的日志记录进行调试! –