如何配置log4j只保留过去七天的日志文件?

时间:2010-09-10 09:02:59

标签: java logging log4j

对于使用log4j进行日志记录的几个Java应用程序,我遇到以下日志记录问题:

我希望每天轮换日志文件,例如

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-04的删除。是否可以使用log4j配置此类行为?如果没有,你知道另一种优雅的解决方案吗?

14 个答案:

答案 0 :(得分:54)

我假设您正在使用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

答案 1 :(得分:26)

您可以在单独的脚本中执行内务管理,该脚本可以每天运行。像这样:

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

答案 2 :(得分:15)

根据以下帖子,您无法使用log4j执行此操作:Use MaxBackupIndex in DailyRollingFileAppender -log4j

据我所知,这个功能应该会变成log4j 2.0,但是这个功能却被牵制了下来。根据logback网站,logback是log4j的预期后继者,因此您可以考虑使用它。

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

答案 3 :(得分:6)

log2j现在支持删除旧日志。查看DefaultRolloverStrategy标记,并在下面的代码段中查看。它在同一天创建最多10个档案,将解析你在最大深度为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>

答案 4 :(得分:4)

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

编辑: 看完这个令人担忧的陈述之后;

  

已观察到DailyRollingFileAppender显示同步   问题和数据丢失。 log4j extras伴侣包括替代品   这应该考虑用于新部署并进行讨论   在org.apache.log4j.rolling.RollingFileAppender的文档中。

从上面的网址(我以前从未意识到),这看起来更好; http://logging.apache.org/log4j/companions/extras/apidocs/index.html

答案 5 :(得分:3)

还有另一个选项 DailyRollingFileAppender 。但它没有你想要的自动删除(保持7天日志)功能

样品

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 (逐日滚动)。

但是没试过,似乎不是标准的1.2分支log4j功能。

答案 6 :(得分:3)

我遇到了这个你想要的appender here,它可以被配置为保留按日期滚动的特定数量的文件。

下载: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"))

答案 7 :(得分:2)

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

我没等一个月检查,但我尝试了mm(即分钟)并确认它覆盖了,所以我假设它适用于所有模式。

答案 8 :(得分:1)

如果您使用的是Linux,则可以使用tmpwatch配置cron作业。

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

如果您使用的是其他系统,则可能存在等效的实用程序。

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

我的脚本基于@dogbane的答案

/etc/cron.daily/hbase

#!/bin/sh
find /var/log/hbase -type f -name "phoenix-hbase-server.log.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" -exec bzip2 {} ";"
find /var/log/hbase -type f -regex ".*.out.[0-9][0-9]?" -exec bzip2 {} ";"
find /var/log/hbase -type f -mtime +7 -name "*.bz2" -exec rm -f {} ";"

/etc/cron.daily/tomcat

#!/bin/sh
find /opt/tomcat/log/ -type f -mtime +1 -name "*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].*log" -exec bzip2 {} ";"
find /opt/tomcat/log/ -type f -mtime +1 -name "*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].txt" -exec bzip2 {} ";"
find /opt/tomcat/log/ -type f -mtime +7 -name "*.bz2" -exec rm -f {} ";"

因为Tomcat轮换需要一天的延迟。

答案 11 :(得分:-1)

班级DailyRollingFileAppender使用 DatePattern 选项指定滚动计划。此模式应遵循标准中的SimpleDateFormat约定。埃德。 6上即可。因此,我们必须使用E选项(星期几)。例如:

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

详细了解DailyRollingFileAppender javadoc here中的log4j课程。遗憾的是,Java 1.4.2文档不再在线,但您可以下载副本here

答案 12 :(得分:-1)

我已经设定了:

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中没有此类属性[maxBackupIndex]   org.apache.log4j.DailyRollingFileAppender。

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

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

它会起作用还是会导致错误? 就像这需要一年才能找到,我可以试试:

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

但仍需要一个月才能找到答案。

答案 13 :(得分:-2)

我创建此方法并通过关闭应用程序来调用它:

  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();
    }
 }