【问题标题】:How to configure log4j to only keep log files for the last seven days?如何将 log4j 配置为仅保留过去 7 天的日志文件?
【发布时间】:2010-09-10 09:02:59
【问题描述】:

我在使用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

但出于数据安全原因,我们公司的日志文件保存时间不得超过 7 天。所以下一个日志文件log.2010-09-11的生成应该会触发log.2010-09-04的删除。是否可以使用log4j 配置这样的行为?如果没有,您知道针对此类日志记录问题的另一种优雅解决方案吗?

【问题讨论】:

  • 这不是重复的,RollingFileAppender 不是 OP 想要的,因为只有 DailyRollingFileAppender 每天旋转文件!
  • 有使用 log4j 和 java 的解决方案 - stackoverflow.com/a/58729657/7179509

标签: java logging log4j


【解决方案1】:

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

【讨论】:

  • 但这会保留最后 700kB 的日志数据,不是吗?我想保留过去 7 天的日志记录数据,与日志文件大小无关。
  • 您实际上会收到一条警告,指出MaxBackupIndex 不是DailyRollingFileAppender 的有效成员。据我所知,log4j 无法做到这一点。您必须自己删除这些日子。
  • 我不认为 log4j.appender.R.MaxBackupIndex=1 只会在服务器上保留 1 个日志文件。我有这个设置,但确实看到旧文件仍然存在。
  • log4j 推荐使用贡献的 RollingFileAppender 而不是它自己的,它确实支持使用 MaxBackupIndex 和 TimeBasedRollingPolicy 进行翻转。见logging.apache.org/log4j/extras/apidocs/org/apache/log4j/…
  • 配置 MaxBackupIndex 后,发现它不适用于 org.apache.log4j.rolling.RollingFileAppender,我查看了源代码。我只在 cmets 中看到了 MaxBackupIndex。我倾向于认为评论是复制/粘贴的,MaxBackupIndex 没有实现。
【解决方案2】:

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

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

【讨论】:

  • 仅供参考:一位匿名用户建议进行编辑,附加以下内容:“为了扩展它,如果您有大量日志/想要节省磁盘空间,您可以压缩旋转的日志,然后删除压缩的记录 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】:

根据下面的帖子,你不能用 log4j 做到这一点:Use MaxBackupIndex in DailyRollingFileAppender -log4j

据我所知,该功能本应纳入 log4j 2.0,但这项工作被搁置了。根据 logback 网站,logback 是 log4j 的预期继任者,因此您可以考虑使用它。

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

【讨论】:

    【解决方案4】:

    log4j2 现在支持删除旧日志。

    看看DefaultRolloverStrategy tag 和下面的sn-ps。

    • 在同一天最多创建 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>
      

    一个好的调试选项是如果你设置:

    <Configuration status="trace">
    

    并像这样使用 testMode 选项:

            <DefaultRolloverStrategy>
              <Delete basePath="${baseDir}" testMode="true">
                <IfFileName glob="*.log" />
                <IfLastModified age="7d" />
              </Delete>
            </DefaultRolloverStrategy>
            
    

    您可以在控制台日志中查看哪些文件会被删除,而无需立即删除这些文件。

    【讨论】:

      【解决方案5】:

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

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

      示例(常规):

      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"))
      

      【讨论】:

      • 感谢您的链接!很棒的包裹!
      【解决方案6】:

      还有一个DailyRollingFileAppender

      编辑:在阅读了这个令人担忧的声明后:

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

      从上面的 URL(我以前从未意识到),那么log4j-extras 看起来是一个更好的选择。

      【讨论】:

        【解决方案7】:

        还有另一个选项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 功能。

        【讨论】:

        • CompositeRollingAppender 听起来很有希望,但我查看了它的代码,它(仍然!)仅在基于大小滚动文件时实现删除旧文件,而不是在基于日期滚动时。很遗憾,因为这应该不难实现。
        【解决方案8】:

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

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

        【讨论】:

        • 创意解决方案,但对于这个 OP,它只有在包含星期几的名称(星期一、星期二、星期三等)时才有效,因为他只想保留 7 天。另外,您知道这是否会覆盖原始内容或只是附加到原始内容?
        【解决方案9】:

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

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

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

        【讨论】:

        • 仅限红帽家族
        【解决方案10】:

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

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

        【讨论】:

          【解决方案11】:

          我的脚本基于@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 轮换需要一天延迟。

          【讨论】:

            【解决方案12】:

            DailyRollingFileAppender 类使用 DatePattern 选项来指定滚动计划。此模式应遵循 Std 中的 SimpleDateFormat 约定。埃德。 v1.4.2。所以,我们必须使用E 选项(星期几)。例如:

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

            log4j 了解更多关于DailyRollingFileAppender 类的信息javadoc here。不幸的是,Java 1.4.2 文档不再在线,但您可以下载一份副本here

            【讨论】:

            • 详细解释一下并链接到文档会很有帮助
            【解决方案13】:

            我已经设置:

            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
            

            但仍需要一个月的时间才能找到。

            【讨论】:

            • 这样做的结果是什么?文件会覆盖吗?
            【解决方案14】:

            我创建了这个 Methode 并通过关闭应用程序来调用它:

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

            【讨论】:

              猜你喜欢
              • 2016-02-18
              • 1970-01-01
              • 1970-01-01
              • 2020-12-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多