2010-08-02 58 views
2

我写了一个定制记录器,唯一的另外是下面的方法:如何防止我的记录器写入多个日志文件实例?

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

不同名称的记录器应该登录到不同的文件吗? – 2010-08-02 22:23:01

+0

@愿上帝没有。每个类都是一个单独的记录器,因此每个类都有一个文件 – TheLQ 2010-08-02 22:32:14

回答

5

在你logging.properties文件检查java.util.logging.FileHandler.limit设置为0

从文档:

java.util.logging.FileHandler.limit 指定要写入的大约最大 数量(以字节为单位)到任何一个 文件。如果这是零,那么有 没有限制。 (默认没有限制)。

对于文件轮换集,因为每个 文件达到给定大小的限制,这是 闭合,旋转出来,一个新的文件 打开。通过将“0”,“1”,“2”等 添加到基本文件名中,连续输出较旧的文件为 。

另一种可能性是您尝试从多个进程写入相同的日志文件。如果记录器检测到文件无法打开(它被另一个进程锁定),它将创建一个新文件,方法是向其添加下一个空闲数字。

+1

我认为这就是发生了什么,即使该方法是同步的,记录器也在检测文件无法打开。任何想法如何实现? – badcodenotreat 2010-08-10 19:56:35

0

@badcodenotreat我遇到了你原来的问题,因为我有类似的问题,并发现@Romain Hippeau的解决方案也有帮助。现在回答你的另一个问题:

“..即使该方法是同步的,记录器正在检测文件无法打开。任何想法如何完成?”。 ...

我在自己独立的类中使用单例设计模式实现了我的FileHandler,因此只有一个日志文件实例被创建,并且在请求发出时返回到主日志应用程序。希望有所帮助。

相关问题