日志轮换工具,只保留指定数量的日志并丢弃其他所有内容

日志轮换工具,只保留指定数量的日志并丢弃其他所有内容

我正在寻找一个类似 cronolog 的工具,它只保留最后 n 行或最后 x 分钟的日志,并丢弃其他所有内容

有这样的野兽吗?

更新:

我知道 logrotate 并且它会重命名和压缩旧日志文件,但这不是我想要的。

我想丢弃旧的日志行并仅保留最近的行。

就像 ie 时不时地这样做一样:tail -10000 logfile > logfile.new mv logfile.new logfile,不同之处在于,使用这种技术肯定会丢失日志行,并且必须重新启动或以其他方式向日志应用程序发出信号以重新打开日志文件。

答案1

Logrotate 可以设置为仅保留日志文件的一个副本...如果您阅读手册 (RTFM),您会发现以下有关配置设置的部分:

rotate count
    Log files are rotated count times before being removed or mailed to the 
    address specified in a mail directive. If count is  0,  old  versions  
    are  removed  rather than rotated.

你可以旋转尺寸,再次来自logrotate(8)手册页,以保持文件大小较小。不是按行数,而是按 k、M、G 大小。

size size
    Log  files  are rotated when they grow bigger than size bytes. If size is 
    followed by M, the size if assumed to be in megabytes.  If the G suffix is 
    used, the size  is  in gigabytes.   If  the k is used, the size is in 
    kilobytes. So size 100, size 100k, and size 100M are all valid.

答案2

您可以使用logrotate并放置

tail -10000 logfile.0 > logfile.0.new 
mv logfile.0.new > logfile.0

作为 postrotate 命令的一部分。logrotate允许您指定 postrotate 命令。

答案3

无论如何,您都必须重新启动或向应用程序发出信号。应用程序必须以某种方式了解 seek() 的新偏移量,或者在您修剪日志文件时必须重新打开文件句柄。

答案4

最后我这样解决了它(不是最优雅的,但它有效):

在 apache 中(或者任何登录的人):

CustomLog "|/usr/local/cronolog/sbin/cronolog /var/tmp/mylog.%Y%m%d.log" logformat

在 cron.daily 中:

find /var/tmp/ -name mylog* -mtime +$days | xargs --no-run-if-empty rm

这将删除旧日志

最后在分析脚本中:

lastdate=$(date -d "$INTERVAL 秒前" +%Y-%m-%dT%H:%M:%S)

grep -h $SEARCH /var/tmp/mylog* | awk -v lastdate="$lastdate" '$1>lastdate { print }' > /tmp/cutlog

然后使用 /tmp/cutlog

上述示例假设第一个字段中的 ISO 时间戳为:2009-07-20T13:52:32

虽然不是最优雅的方式,但它能满足我的要求。也许有一天我会为 cronolog 编写一个功能来做同样的事情 :)

相关内容