【问题标题】:How to configure log4j to only keep log files for the last n days?如何将 log4j 配置为仅保留最近 n 天的日志文件?
【发布时间】:2016-02-18 13:38:08
【问题描述】:

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

我们现在的解决方案是使用带有脚本的 cron。 比如像这样:How to configure log4j to only keep log files for the last seven days?

但这里有一些主要问题:

  1. 使用数百台机器(n)
  2. 在多台机器上使用多个 crons(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 TimeBasedTriggeringPolicy
  • 保留实际日志和 n 个轮换文件。较旧的被删除:app.log, app.{-1 day}.log.gz,..., app.{-n days}.log.gz
  • 模式名称并不重要,它可以是文件名中的数字
  • 我们不能使用大小作为触发器。我们不知道该程序在白天会做多少。日志大小变化非常非常大
  • 它应该是独立于结构和操作系统的。我们更喜欢增强 log4j 属性或 XMl 文件,而不是添加脚本和 cron 触发器。

我尝试将 DefaultRolloverStrategy 与 TimeBasedTriggeringPolicy 一起使用。但问题是:

  1. filePattern=${filename}.%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 以便它处理所有这些任务吗?

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

【问题讨论】:

    标签: java date logging cron


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答。我会继续寻找
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多