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

asm*_*ier 53 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
Run Code Online (Sandbox Code Playgroud)

但出于数据安全原因,我们不允许在我的公司保留超过七天的日志文件.因此,下一个下一个日志文件的生成log.2010-09-11应该触发删除log.2010-09-04.是否可以配置这样的行为log4j?如果没有,你知道另一种优雅的解决方案吗?

dty*_*dty 56

我假设您正在使用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
Run Code Online (Sandbox Code Playgroud)

  • 实际上,您会收到一条警告:"MaxBackupIndex"不是"DailyRollingFileAppender"的有效成员.据我所知,没有办法用log4j做到这一点.你必须自己删除这些日子. (23认同)
  • 但那会保留最后700kB的日志记录数据,不是吗?我想保留过去7天的数据记录,与日志文件大小无关. (12认同)
  • log4j推荐使用的是RollingFileAppender而不是它自己的,它支持使用MaxBackupIndex和TimeBasedRollingPolicy进行翻转.请参阅https://logging.apache.org/log4j/extras/apidocs/org/apache/log4j/rolling/RollingFileAppender.html (4认同)

dog*_*ane 27

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

find /path/to/logs -type f -mtime +7 -exec rm -f {} \;
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:一位匿名用户建议编辑附加以下内容:“为了扩展这一点,如果您有大量日志/想要节省磁盘空间,您可以压缩轮换的日志,然后删除 X 天前的压缩日志。我做了一些事情如: find /path/to/logs -type f -name "*.log.[0-9][0-9][0-9][0-9]-[0-9][0-9] -[0-9][0-9]" -exec bzip2 '{}' \; && find /path/to/logs -type f -mtime +7 -name "*.bz2" -exec rm -f '{ }' \;" (3认同)

Phi*_*Din 15

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

据我所知,这个功能应该被用于log4j 2.0,但是这种努力得到了改进.根据logback网站,logback是log4j的预期继承者,因此您可以考虑使用它.

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


ski*_*kim 6

log2j现在支持删除旧日志.查看DefaultRolloverStrategy标记,并在下面的代码段中查看.它在同一天创建最多10个档案,将解析您在Properties标签下定义的$ {baseDir}目录,最大深度为2,日志文件名与"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>
Run Code Online (Sandbox Code Playgroud)