我正在寻找一个类似 cronolog 的工具,它只保留最后 n 行或最后 x 分钟的日志,并丢弃其他所有内容
有这样的野兽吗?
更新:
我知道 logrotate 并且它重命名和压缩旧的日志文件,这不是我想要的。
我想丢弃旧的日志行,只保留最近的行。
就像经常这样做:tail -10000 logfile > logfile.new mv logfile.new logfile 除了使用这种技术您肯定会丢失日志行并且您必须重新启动或以其他方式向日志应用程序发出信号以重新打开日志文件。
我正在寻找一个类似 cronolog 的工具,它只保留最后 n 行或最后 x 分钟的日志,并丢弃其他所有内容
有这样的野兽吗?
更新:
我知道 logrotate 并且它重命名和压缩旧的日志文件,这不是我想要的。
我想丢弃旧的日志行,只保留最近的行。
就像经常这样做:tail -10000 logfile > logfile.new mv logfile.new logfile 除了使用这种技术您肯定会丢失日志行并且您必须重新启动或以其他方式向日志应用程序发出信号以重新打开日志文件。
可以使 Logrotate 只保留一个日志文件的副本...如果您使用 RTFM,您会发现以下有关配置设置的信息:
您可以再次从logrotate(8)手册页中将rotate与size结合起来,以保持文件较小。虽然不是按行数,而是按 k、M、G 大小。
您可以使用
logrotate
并放置作为 postrotate 命令的一部分。
logrotate
允许您指定 postrotate 命令。无论如何,您都必须重新启动应用程序或发出信号。应用程序必须以某种方式了解 seek()ing 的新偏移量,或者在修剪日志文件时必须重新打开文件句柄。
不完全是你在说什么,但你可以看看
logrotate(8)
。从手册页:它默认安装在 RHEL 和衍生产品上。我不知道其他任何东西,比如 Ubuntu/derivitives 或 Windows。
最后我解决了这个问题(不是最优雅的,但它有效):
在 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 写一个功能,它会做同样的事情:)