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

如何使log4j仅按需创建日志文件?,log4j,Log4j,我们有一个模块化应用程序,其中模块有自己的log4j日志(即通信日志和错误日志)。这些附加器和类别都在核心log4jxml中配置,但并非所有模块都始终安装。 DailyRollingFileAppender创建其文件时不考虑使用情况,并公开了完整的模块集(尽管不存在),因为其中一些模块是特定于客户的,所以我们希望隐藏未使用的日志。 有没有办法让DailyRollingFileAppender在第一次使用时创建其文件,而不是在启动时自动创建?文件附加器没有延迟创建日志文件的选项-如果文件不存在,s

我们有一个模块化应用程序,其中模块有自己的log4j日志(即通信日志和错误日志)。这些附加器和类别都在核心log4jxml中配置,但并非所有模块都始终安装。 DailyRollingFileAppender创建其文件时不考虑使用情况,并公开了完整的模块集(尽管不存在),因为其中一些模块是特定于客户的,所以我们希望隐藏未使用的日志。
有没有办法让DailyRollingFileAppender在第一次使用时创建其文件,而不是在启动时自动创建?

文件附加器没有延迟创建日志文件的选项-如果文件不存在,
setFile
方法会自动创建文件:
ostream=new FileOutputStream(fileName,append)


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

我也遇到了同样的问题,因此我扩展了标准FileAppender类,并创建了一个新的FileAppender,它是一个延迟初始化日志文件的FileAppender(仅在第一次写入操作发生时创建)

可以在我创建的一个简单库中找到标准log4j库的和其他一些附加内容:


您可以查看源代码来开发自己的扩展,也可以按原样使用…

扩展标准FileAppender类对我来说不成功。因此,我找到了另一个解决方案,使用appenders以编程方式仅按需创建日志文件(名称文件中带有时间戳)。我写了这两种方法:

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文件仅配置控制台附加程序。当我想开始记录日志时,我调用startLog()方法。当我想登录另一个文件时,我首先调用stopLog(),然后调用startLog()方法。

在Log4j 2中,FileAppender和RollingFileAppender都有参数“createOnDemand”,该参数可用于配置为仅当日志事件传递给appender时才创建日志文件

例如:

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


此处有更多详细信息:

为什么不在核心XML中排除禁用组件的块?我们正在部署log4j配置oonce,然后可以稍后添加模块。当我们将log4j详细信息保留为本地更改时,我们很难在以后的安装中修改该文件。是的,我们需要高水平的安装自动化。我知道这个答案有点晚了,但我最近一直在与Log4j作斗争,所以没有留下任何悬而未决的问题:-)