我正在我的项目中实现Log4j。我想将每个n(例如10个)日志条目记录到新文件中。我尝试使用' RollingFileAppender'但我认为它只会根据大小和时间更改日志文件。
到目前为止,我做了以下代码:
log4j.properties
log4j.logger.ControlTable=debug, controlTable
log4j.additivity.ControlTable = false
log4j.appender.controlTable=org.apache.log4j.RollingFileAppender
log4j.appender.controlTable.File=${log4jfilename}
log4j.appender.controlTable.MaxFileSize=10MB
log4j.appender.controlTable.MaxBackupIndex=10
log4j.appender.controlTable.layout=org.apache.log4j.PatternLayout
主要
public class ControlTableLoggerConsumer {
static {
System.setProperty("log4jfilename","d:\\control_log_1_9.json");
}
private static final Logger log = Logger.getLogger("ControlTable");
private static long logEntries = 0;
public static void main(String args[]) {
System.out.println("Curr log file:"+logEntries+"::"+System.getProperty("log4jfilename"));
log.info("Log entry:"+logEntries);
logEntries++;
if((logEntries >= 10) && ((logEntries % 10) == 0)) {
System.out.println("going to change file name to "+"d:\\control_log_"+logEntries+"_"+(logEntries+9)+".json");
System.setProperty("log4jfilename","d:\\control_log_"+logEntries+"_"+(logEntries+9)+".json");
}
if(logEntries == 1000)
break;
}
在控制台上我可以看到每10个条目的文件名都在变化,但是在我的D盘中我只能看到一个包含所有日志信息的文件。
答案 0 :(得分:1)
最后我解决了这个问题如下。
Properties props = new Properties();
try {
InputStream configStream = getClass().getResourceAsStream("/log4j.properties");
props.load(configStream);
configStream.close();
} catch (IOException e) {
System.out.println("Errornot laod configuration file ");
}
props.setProperty("log4j.appender.controlTable.File", logFile);
LogManager.resetConfiguration();
PropertyConfigurator.configure(props);
现在我可以动态登录到不同的文件。希望它也有助于其他人。
答案 1 :(得分:0)
您的解决方案对我来说似乎不是一个很好的解决方案,因为:
logEntries
。 考虑编写自定义Appender(我打赌你可以大部分复制RollingFileAppender
内的内容,但只是将触发条件从文件大小更改为写入的记录数。
简要介绍RollingFileAppender
。似乎您可以从中扩展,并覆盖subAppend()
方法。
public class RowCountRollingFileAppender extends FileAppender {
// constructors
// getter setters
private maxEntries = 10; // provided through config
private currentEntries = 0;
public void rollOver() {
currentEntries = 0;
super.rollOver();
}
protected void subAppend(LoggingEvent event) {
super.subAppend(event);
currentEntries++;
if (fileName != null
&& qw != null
&& currentEntries > maxEntries) {
rollOver();
}
}
}
然后,如果任一文件达到最大大小,或者记录了n
条消息,则可以使用一个将翻转的appender。