如何configurationlog4j只保留最近七天的日志文件?

我有几个使用log4j进行日志logging的Java应用程序的日志logging问题:

我希望日志文件能够每天轮换,就像

 log.2010-09-10 log.2010-09-09 log.2010-09-08 log.2010-09-07 log.2010-09-06 log.2010-09-05 log.2010-09-04 

但出于数据安全的原因,我们不允许在我的公司保留超过七天的日志文件。 所以生成下一个日志文件log.2010-09-11应该会触发log.2010-09-11的删除。 有没有可能用log4jconfiguration这样的行为? 如果没有,你知道这种logging问题的另一个优雅的解决scheme吗?

你可以在一个单独的脚本中执行你的家务pipe理,这个脚本可以每天运行一次。 像这样的东西:

 find /path/to/logs -type f -mtime +7 -exec rm -f {} \; 

我假设你正在使用RollingFileAppender? 在这种情况下,它具有一个名为MaxBackupIndex的属性,您可以设置该属性来限制文件数量。 例如:

 log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=example.log log4j.appender.R.MaxFileSize=100KB log4j.appender.R.MaxBackupIndex=7 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n 

根据以下文章,你不能用log4j做到这一点: 在DailyRollingFileAppender -log4j中使用MaxBackupIndex

据我所知,这个function本来是应该成为log4j 2.0的,但是这种努力已经被打破了。 根据logback网站,logback是log4j的预定继任者,所以你可以考虑使用它。

有一个名为SLF4J的API,它提供了一个通用的API来logging日志。 它会在运行时加载实际的日志实现,所以根据你提供的configuration,它可以使用java.util.log或者log4j或者logback或者任何其他能够提供日志function的库。 从使用log4j直接到使用SLF4J将会有一些前期工作,但是他们提供了一些工具来自动化这个过程。 一旦将代码转换为使用SLF4J,切换日志后端应该只是更改configuration文件的情况。

log2j现在支持删除旧的日志。 看看DefaultRolloverStrategy标签,并在下面的代码片断。 它将在同一天创build最多10个存档,将parsing在最大深度为2的属性标记下定义的$ {baseDir}目录,日志文件名匹配“app – *。log.gz”并删除超过7个的日志但如果您最近的5个日志超过7天,请保留最新的5个日志。

  <DefaultRolloverStrategy max="10"> <Delete basePath="${baseDir}" maxDepth="2"> <IfFileName glob="*/app-*.log.gz"> <IfLastModified age="7d"> <IfAny> <IfAccumulatedFileCount exceeds="5" /> </IfAny> </IfLastModified> </IfFileName> </Delete> </DefaultRolloverStrategy> 

还有一个DailyRollingFileAppender; http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html

编辑:读完这个令人担忧的陈述后,

DailyRollingFileAppender被观察到展示同步问题和数据丢失。 log4j额外的同伴包括了新部署应该考虑的选项,在org.apache.log4j.rolling.RollingFileAppender的文档中讨论过。

从上面的URL(我从来没有意识到),这看起来像一个更好的赌注, http://logging.apache.org/log4j/companions/extras/apidocs/index.html

我在这里遇到了这个appender,它可以根据你的需要进行configuration,以保持特定数量的文件,这些文件已经按date进行了翻转。

下载: http : //www.simonsite.org.uk/download.htm

示例(groovy):

 new TimeAndSizeRollingAppender(name: 'timeAndSizeRollingAppender', file: 'logs/app.log', datePattern: '.yyyy-MM-dd', maxRollFileCount: 7, compressionAlgorithm: 'GZ', compressionMinQueueSize: 2, layout: pattern(conversionPattern: "%d [%t] %-5p %c{2} %x - %m%n")) 

还有另一个选项DailyRollingFileAppender 。 但它缺less自动删除(保持7天的日志)function,你要找的

样品

 log4j.appender.DRF=org.apache.log4j.DailyRollingFileAppender log4j.appender.DRF.File=example.log log4j.appender.DRF.DatePattern='.'yyyy-MM-dd 

我遇到了一些调用org.apache.log4j.CompositeRollingAppender的东西,它结合了RollingFileAppender (maxSizeRollBackups,备份文件的编号)和DailyRollingFileAppender (每天滚动)的function。

但是没有试过,似乎不是标准的1.2分支log4jfunction。

如果您正在使用Linux,则可以使用tmpwatchconfigurationcron作业。

大多数Linux系统都有一个tmpwatch cron作业来清除/ tmp目录。 您可以添加另一个监视日志logging目录并删除超过7天的文件。

如果您正在使用不同的系统,则可能有等效的实用程序。

使用设置log4j.appender.FILE.RollingPolicy.FileNamePattern ,例如log4j.appender.FILE.RollingPolicy.FileNamePattern=F:/logs/filename.log.%d{dd}.gz保存日志在一个月前翻转。

我没有等待一个月检查,但我试了毫米(即分钟),并确认它覆盖,所以我认为它会适用于所有模式。

DailyRollingFileAppender类使用DatePattern选项来指定滚动时间表。 这个模式应该遵循标准SimpleDateFormat约定 埃德。 v1.4.2 。 所以,我们必须使用E选项(星期几)。 例如:

 <param name="DatePattern" value="'.'EEE"/> 

在这里查看更多关于来自log4j javadoc的 DailyRollingFileAppender类。 不幸的是,Java 1.4.2文档已经不在线了,但是你可以在这里下载一个副本。

我已经设定:

 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender log4j.appender.R.DatePattern='.'yyyy-MM-dd # Archive log files (Keep one year of daily files) log4j.appender.R.MaxBackupIndex=367 

和我之前的其他人一样,DEBUG选项给我显示了错误:

log4j:WARN org.apache.log4j.DailyRollingFileAppender中没有这样的属性[maxBackupIndex]。

这里有一个想法,我还没有尝试过,假设我设置DatePattern,使文件在所需的时间段之后相互覆盖。 要保留一年的价值,我可以尝试设置:

 log4j.appender.R.DatePattern='.'MM-dd 

它会工作还是会导致错误? 这样就需要一年才能知道,我可以试试:

 log4j.appender.R.DatePattern='.'dd 

但还需要一个月才能知道。

尽pipe启动了一个chrone作业,但对于这个任务,我们可以在logstash的config文件夹中使用log4j2.properties文件。 看看下面的链接,这将是有益的。

https://github.com/elastic/logstash/issues/7482

我创build了这个Methode并通过closures应用程序来调用它:

  public void deleteFiles(){ File f = new File("log"); File[] fileArray = f.listFiles(); double timenow = System.currentTimeMillis(); double olderTenDays = timenow - 864000000;// MS for ten days for (int i = 0; i < fileArray.length; i++) { if(fileArray[i].lastModified()< olderTenDays ) fileArray[i].delete(); } }