如何阻止我的记录器编写多个日志文件实例?

时间:2010-08-02 22:09:47

标签: java logging

我写了一个自定义记录器,其中唯一的添加是以下方法:

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等。

如何防止这种情况发生?

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,因此只创建了一个日志文件实例,并在发出请求时随时返回到我的主日志记录应用程序。希望有所帮助。