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