我正在寻找一个类似 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 编写一个功能来做同样的事情 :)