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