【问题标题】:logrotate: delete tomcat/jboss logs older than n dayslogrotate:删除超过 n 天的 tomcat/jboss 日志
【发布时间】:2014-01-27 16:51:19
【问题描述】:

我还没有找到清除旧的 tomcat 或 jboss 日志或任何其他时间戳日志的解决方案:catalog.log./server.log.。基本上这些日志由 jboss 轮换为: server.log、server.log.20131201、server.log.20131203等等。

有没有办法可以使用 logrotate 删除超过 n 天的日志?我不想在 postrotate 中使用 find 或调整 jboss/tomcat 日志记录属性。我只想知道 logrotate 是否真的可以自己实现这一点。我知道这不是很有成效,但我遇到了一个需要解决这个问题的问题。

【问题讨论】:

  • 这个答案可能会有所帮助:stackoverflow.com/questions/2772021/…
  • 嘿,我知道如何将 tomcat 日志记录调整为如何使用 crons 管理日志。我以tomcat为例。我的问题是 logrotate 是否可以自行删除旧的时间戳文件。
  • 根据上述答案:否
  • 您提供的答案没有谈论 unix logrotate,所以不确定您是如何得出结论的。该答案谈到了tomcat自己的日志轮换。

标签: linux logging logrotate log-rotation


【解决方案1】:

如果你不想在postrotate 中使用find,不,你不能。

logrotate 将 Tomcat/JBoss 旋转的每个 server.log 实例视为不同的文件,并且由于它们是唯一的,logrotate 将只旋转一次。 maxage - 删除早于 n 天的轮换日志的指令 - 仅在要轮换日志文件时检查,因此 maxage 仅执行一次并且无法跟踪文件的年龄。

但是,如果您改变了使用find 的想法,logrotate 可以帮助您简化 Tomcat 和 JBoss 创建的日志文件的管理。我用它来压缩和删除旧文件,配置文件如下:

/path/to/logs/server.log.????-??-?? {
    compress
    compresscmd /usr/bin/bzip2
    nocreate
    nodateext
    ifempty
    missingok
    rotate 1
    size 0
    start 0
    lastaction
        # Remove rotated files older than 180 days
        find /path/to/logs -name 'server.log.????-??-??.0.bz2' -mtime +180 -exec rm {} \;
    endscript
}

地点:

  • rotate 1 和 compress 重命名并压缩,例如,server.log.20131201 到 server.log.20131201.0.bz2。时间戳和.bz2 扩展之间的0 来自start 0。
  • size 0 确保文件始终被重命名和压缩。
  • lastaction 块会删除超过 180 天的旋转文件。

【讨论】:

  • 这是一个很好的答案。我花了一段时间才找到它,但它应该在我的搜索结果的顶部!我确实遇到了以 su 开头的行的问题。我从我的配置中删除了它,这似乎没有引起问题。
  • @Philippe 很高兴您发现我的回答很有用,在找到令人满意的配置之前,我进行了很多试验和错误。 su 关键字仅在您希望日志文件归运行应用程序的用户/组所有时才有用。这令人困惑,我已将其从答案中删除。并感谢您纠正missingok。
  • -mtime +180 是什么意思?
  • @RyanLv -mtime +180 表示“修改时间超过过去180天”。 find 将匹配在 -name 选项中指定的名称超过 180 天的文件。请注意,类 UNIX 文件系统(包括 macOS 和 Linux)在处理文件更改时通常有两个不同的参考时间:change time,每次文件状态信息时都会设置,或者更具体地说,inode信息,变化,以及修改时间,在文件内容被修改时设置。请参阅unix.stackexchange.com/a/132661 了解更多信息。
【解决方案2】:

logrotate 可以管理您的日志轮换日志,并最终保留有限数量的轮换日志。但是 AFAIK 它只能对它直接管理的日志执行此操作。如果您的日志已经被其他代理(即 Tomcat 本身)轮换,那么 logrotate 将无法做任何事情,仅仅是因为对其他代理执行的轮换一无所知。

所以答案是否定的,你不能使用 logrotate 来删除不由自己管理的日志(我认为甚至不打算做这样的事情)。

【讨论】:

    【解决方案3】:

    你可以把脚本放到/etc/cron.daily。例如:

    cat /etc/cron.daily/tomcat-rotate-logs

    #!/bin/sh
    
    # erasing tomcat logs older then 7 days
    
    for x in $(find /var/log/tomcat/ -type f -mtime +7);
    do
           rm "$x";
           logger -t TOMCAT-ROTATE-LOGS "Erasing $x [done]"; 
    done
    

    或创建一个 logrotate 配置。例如: cat /etc/logrotate.d/tomcat

    /var/log/tomcat/*.log {
            su tomcat tomcat
            copytruncate  
            daily  
            rotate 6  
            compress  
            missingok
    }
    

    "su tomcat tomcat" - 代表避免logrotate error on wrong permissions

    【讨论】:

      【解决方案4】:

      不确定@jaume 的配置是否会正确处理正在写入的日志文件。特别是使用“nocreate”选项。想看看他对这一点的评论。 至于我,拒绝 logrotate 并在 cron 中仅使用 bash 脚本会更容易。 像这样的:

      #!/bin/bash
      /usr/bin/find /path/to/logs/ -name 'server.log.????-??-??.gz' -mtime +7 -delete
      /usr/bin/find /path/to/logs/ -name 'server.log.????-??-??' -mtime +1 -exec gzip -q {} \;
      

      【讨论】:

      • 抱歉,直到现在才看到你的帖子...如果正在写入日志文件,我的配置将无法正常工作,因为打开文件上的rm 会将其从目录列表但不是来自文件系统。也就是说,该文件将仍然存在并增长,直到 Tomcat 重新启动。这就是为什么我只旋转名为 server.log.????-??-?? 的文件:这些文件已经被 log4j 旋转并且 Tomcat 不再向它们写入。
      猜你喜欢
      • 2011-02-15
      • 1970-01-01
      • 2016-04-18
      • 2017-12-04
      • 2015-03-25
      • 2021-07-08
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多