java - 如何配置log4j只保留最近n天的日志文件?

标签 java date logging cron

我的名字是 Luis Ribeiro,我正在尝试设置 log4j,以便它将删除较旧的轮换日志。

我们目前的解决方案是将 cron 与脚本结合使用。 例如这样:How to configure log4j to only keep log files for the last seven days?

但这里有一些主要问题:

  1. 使用数百台机器
  2. 在多台机器上使用多个 cron(n * m)
  3. 使用不同的结构和操作系统(n * m * z)
  4. 即使应用程序停止且信息丢失,Cron 也会删除

理想的情况是,当应用程序运行时,log4j 将完成日志轮换。

  • 每天轮换一次:RollingFile: Daily and filePattern="logs/${filename}.[ %d{yyyy-MM-dd} | -%i | any type of counter ].log.gz"with基于时间的触发策略
  • 保留实际日志和 n 个循环文件​​。较旧的已删除:app.log、app.{-1 天}.log.gz、...、app.{-n 天}.log.gz
  • 模式名称并不重要,它可以是文件名中的数字
  • 我们不能使用大小作为触发器。我们不知道该程序白天会执行多少操作。日志大小变化很大
  • 它应该独立于结构和操作系统。我们更喜欢增强 log4j 属性或 XMl 文件,而不是添加脚本和 cron 触发器。

我尝试将 DefaultRolloverStrategy 与 TimeBasedTriggeringPolicy 结合使用。但问题是:

  1. filePattern=${文件名}.%d{yyyy-MM-dd}-%i.log.gz 将生成:app.log, app.{-1 day}-1.log.gz, app. {-2 天}-1.log.gz,..., app.{-(n + 1) 天}-1.log.gz,... => 永远不会被删除
  2. filePattern=${filename}-%i.log.gz 导致 java.lang.IllegalStateException:模式不包含日期

有什么方法可以增强 log4j 以便它能够处理所有这些任务吗?

致以最诚挚的问候, 路易斯

最佳答案

因为DailyRollingFileAppender没有属性MaxBackupIndex,所以你必须自己删除日志。

或者你可以执行 crontab 来进行大扫除,例如:

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

关于java - 如何配置log4j只保留最近n天的日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33752604/

相关文章:

java - 有效地从数组中获取落在某个范围内的元素

java - PDFRenderer 的问题

mysql - 在一个 id 中减去多个日期

java - Java 中的自定义注释

java - 使用 Apache Spark 将 RDD 写入文本文件

java - 如何跳过 xml 标签内文本的验证?

java - 在java中获取今天的日期

swift - 如何快速从网站调用/获取日期和时间

logging - ELK - Logstash + Redis - 数据复制

python - python日志记录是否在它自己的线程中运行?