如何使log4j仅按需创建日志文件?

时间:2010-04-27 08:50:05

标签: log4j

我们有一个模块化应用程序,其中模块有自己的log4j日志(即通信日志和错误日志)。这些的appender和类别都在核心log4j XML中配置,但并非总是安装所有模块。 DailyRollingFileAppender无论使用什么都会创建其文件,并且尽管不存在,但它会公开完整的模块集,并且由于其中一些模块是客户特定的,我们希望隐藏未使用的日志。 是否有办法让DailyRollingFileAppender在首次使用时创建其文件而不是在启动时自动创建?

4 个答案:

答案 0 :(得分:6)

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

标准log4j库的LazyFileAppender和其他一些补充可以在我创建的一个简单库中找到:log4j-additions

您可以查看源代码以开发自己的扩展程序,也可以按原样使用它...

答案 1 :(得分:4)

文件追加程序没有懒惰创建日志文件的选项 - setFile方法会自动创建文件(如果该文件尚不存在):ostream = new FileOutputStream(fileName, append);

您必须自己扩展appender并覆盖文件初始化代码,以获得您所追求的行为。

答案 2 :(得分: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()方法。

答案 3 :(得分:0)

在Log4j 2中,FileAppender和RollingFileAppender都具有参数“ createOnDemand”,仅当将日志事件传递到附加程序时,该参数才可用于配置创建日志文件。

示例:

<RollingFile name="LogFile" fileName="test.log" filePattern="test-%i.log.gz" createOnDemand="true">
    <Policies>
        <SizeBasedTriggeringPolicy size="1MB"/>
    </Policies>
    <DefaultRolloverStrategy max="5"/>
</RollingFile>

此处有更多详细信息:https://logging.apache.org/log4j/2.x/manual/appenders.html#RollingRandomAccessFileAppender