我有一个使用log4j登录文本文件的应用程序,我在我的可执行jar文件中放置了一个包含默认日志配置参数的log4j.properties文件。
我的log4j.properties文件如下所示:
log4j.rootLogger=INFO, A1
log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.File=mylogfile.log
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{dd/MM/yyyy HH\:mm\:ss,SSS} %-5p [%t] - %m%n
我的应用程序还有一个命令行选项,允许用户更改日志文件名,所以我有一个像下面这样的函数在运行时更改log4j的设置:
public void changeLogFileName(String filename) {
props.setProperty("log4j.appender.A1","org.apache.log4j.DailyRollingFileAppender");
props.setProperty("log4j.appender.A1.DatePattern","'-'ddMMyyyy");
props.setProperty("log4j.appender.A1.File",filename);
LogManager.resetConfiguration();
PropertyConfigurator.configure(props);
}
一切正常,除非语句 LogManager.resetConfiguration()和/或 PropertyConfigurator.configure(props)执行默认的空日志文件( mylogfile.log)是自动创建的。 之后,我在应用程序中记录的所有内容都将在新文件中正确写入,但无论如何都会创建一个空文件(在log4j.properties中使用默认日志文件名的名称)。
有没有办法避免创建空的默认日志文件?
答案 0 :(得分:1)
我最终开发了log4j-additions库,允许创建一个Lazy初始化appender,避免创建空日志文件。
#Lazy File Appender
log4j.appender.A1=org.pollerosoftware.log4j.additions.appenders.LazyFileAppender
log4j.appender.A1.File=juakaritoglory.log
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{dd/MM/yyyy HH\:mm\:ss,SSS} %-5p [%t] - %m%n
/**
* Change the path of log file
* @param path new path
*/
public synchronized void changeLogPath(String path) {
String filename = (path.endsWith(File.separator)) ? path : path + File.separator;
filename += LOGFILENAME + "-{timestamp}.log";
props.setProperty("log4j.appender.A1","org.pollerosoftware.log4j.additions.appenders.TimestampFileAppender");
props.setProperty("log4j.appender.A1.TimestampPattern","ddMMyyyy");
props.setProperty("log4j.appender.A1.File",filename);
LogManager.resetConfiguration();
PropertyConfigurator.configure(props);
}