2010-04-27 97 views
10

我们有一个模块化应用程序,其中模块具有自己的log4j日志(即通信日志和错误日志)。这些appender和类别都在核心log4j XML中配置,但并非所有模块都始终安装。 DailyRollingFileAppender创建其文件,不管使用情况如何,并且公开了整套模块,尽管不存在,并且由于其中一些模块是特定客户,我们希望隐藏未使用的日志。 有没有办法使DailyRollingFileAppender首次使用而不是自动启动时创建它的文件?如何让log4j只根据需要创建日志文件?

+0

为什么不在核心XML中排除禁用组件的块? – newtover 2010-04-27 09:41:42

+0

我们正在部署log4j配置oonce,然后可以添加模块。在我们将log4j的详细信息打开以进行本地更改时,我们很难在以后的安装中修改该文件。 是的,我们需要高水平的安装自动化。 – Mirvnillith 2010-04-29 08:26:42

回答

4

文件追加程序别无选择,懒洋洋地创建日志文件 - 如果不已经setFile方法会自动创建该文件存在:ostream = new FileOutputStream(fileName, append);

你将不得不延长的appender和覆盖该文件初始化编写自己的代码来获得你所追求的行为。

+0

我很欣赏这个答案有点晚,但是我最近一直在和Log4j进行太多的争斗,不愿意留下悬念:-) – Andy 2010-11-08 15:38:43

+0

我只需要咬那个子弹然后...... – Mirvnillith 2010-11-15 13:49:01

6

我有同样的问题,所以我扩展了标准的FileAppender类,并且创建了一个新的LazyFileAppender,这是一个FileAppender,它懒散地初始化日志文件(仅当第一次写入操作发生时才创建它)。

LazyFileAppender和标准log4j库的一些其他附加功能可以在我创建的简单库中找到:log4j-additions

你可以看一下源开发自己的扩展,或者您可以使用它作为是...

0

扩展标准FileAppender类是不成功我。所以我发现了另一个解决方案,它使用appender以编程方式创建日志文件(仅在名称文件中使用时间戳)。我写了这两种方法:

public void startLog() { 
    SimpleDateFormat sdf_long = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); 
    FileAppender fa = new FileAppender(); 
    fa.setName("foo"); 
    fa.setFile(sdf_long.format(new Date()) + ".log"); 
    fa.setLayout(new PatternLayout("%d{HH:mm:ss.SSS} %m%n")); 
    fa.setThreshold(Level.DEBUG); 
    fa.setAppend(true); 
    fa.activateOptions(); 
    Logger.getRootLogger().addAppender(fa); 
} 

public void stopLog() { 
    Logger.getRootLogger().getAppender("foo").close(); 
    Logger.getRootLogger().removeAppender("foo"); 
} 

我的log4j.properties文件只配置控制台appender。当我想开始记录时,我调用startLog()方法。当我想登录其他文件时,我先调用stopLog(),然后再调用startLog()方法。