我写了一个自定义记录器,其中唯一的添加是以下方法:
public static synchronized Logger getLogger(String name) {
try {
boolean append = true;
FileHandler handler = new FileHandler("tmp.log", append);
Logger log = Logger.getLogger(name);
log.addHandler(handler);
return log;
} catch (java.io.IOException ex) {
//Logger.getLogger(LibraLogger.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
//Logger.getLogger(LibraLogger.class.getName()).log(Level.SEVERE, null, ex);
}
return Logger.getLogger(name);
}
它生成一系列日志文件tmp.log,tmp.log.1,tmp.log.2等。
如何防止这种情况发生?
答案 0 :(得分:5)
在logging.properties文件中,检查java.util.logging.FileHandler.limit是否设置为0.
来自文档:
java.util.logging.FileHandler.limit 指定近似最大值 写入(以字节为单位)到任何一个 文件。如果这是零,则有 没有限制。 (默认为无限制)。
对于一组旋转文件,每个文件 文件达到给定的大小限制,它是 关闭,旋转和新文件 打开。连续旧文件是 通过添加“0”,“1”,“2”等命名 进入基本文件名。
另一种可能性是您尝试从多个进程写入相同的日志文件。如果记录器检测到某个文件无法打开(它被另一个进程锁定),则会通过向其添加下一个空闲号码来创建一个新文件。
答案 1 :(得分:0)
@badcodenotreat我遇到了你原来的问题,因为我遇到了类似的问题,并发现@Romain Hippeau的解决方案也很有帮助。现在回答你的另一个问题:
“..即使方法同步,记录器也检测到文件无法打开。任何想法如何实现?”。 ......
我使用单一设计模式在自己独立的类中实现了我的FileHandler,因此只创建了一个日志文件实例,并在发出请求时随时返回到我的主日志记录应用程序。希望有所帮助。