使用Logger和FileHandler Class of Java.util时,几秒钟后日志文件没有更新

我使用以下类’LoggerUtil’来记录到控制台和文件’logfile.log’。 记录到控制台工作正常。 但是,记录到’logfile.log’文件在几个日志后停止。 任何有关查找错误的建议都会受到欢迎。 我附上以下代码:

public class LoggerUtil { public static final String LOGGERNAME = "project.logging"; static { try { Logger.getLogger(LOGGERNAME).setUseParentHandlers(false); Handler ch = new ConsoleHandler(); Handler fh = new FileHandler("logfile.log"); SimpleFormatter sf = new SimpleFormatter(); fh.setFormatter(sf); Logger.getLogger(LOGGERNAME).addHandler(ch); Logger.getLogger(LOGGERNAME).addHandler(fh); setHandlersLevel(Level.ALL); } catch (IOException | SecurityException ex) { Logger.getLogger(LoggerUtil.class.getName()).log(Level.SEVERE, null, ex); } } public static void setHandlersLevel(Level level) { Handler[] handlers = Logger.getLogger(LOGGERNAME).getHandlers(); for (Handler h : handlers) { h.setLevel(level); } Logger.getLogger(LOGGERNAME).setLevel(level); } public static Logger getLogger() { return Logger.getLogger(LOGGERNAME); } } 

我从我的项目中的各个地方调用以下代码来记录:

 LoggerUtil.getLogger().log(Level.INFO, "Message to be logged"); 

请注意,我的项目是multithreading的。 各种线程使用相同的文件进行日志记录。 这可能是一个并发问题,还是只是一个红鲱鱼!

对记录器进行硬性参考。 经验法则是在您的class级中使用静态最终字段。

 public static final String LOGGERNAME = "project.logging"; //Pin logger in memory. private static final Logger logger = Logger.getLogger(LOGGERNAME); 

从记录器。 getLogger(String)文档:

注意:LogManager可能只保留对新创建的Logger的弱引用。 重要的是要理解,如果没有对Logger的强引用,则可以随时对先前创建的具有给定名称的Logger进行垃圾收集。

当记录器被垃圾收集时,您的ConsoleHandler和FileHandler不会重新连接到新的记录器。

使用FindBugs因为它检测到这种错误模式 :

LG:由于OpenJDK中的弱引用导致记录器可能丢失(LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE)