我使用 crontab 每 4 小时运行一次 logrotate。我想每 50G 旋转一次文件,预计在 4 小时内完成。我的日志轮转配置如下所示:
/log/*/*/*/*.log
{
size 50G
copytruncate
missingok
notifempty
nocompress
postrotate
dir=${1%/*}
mv "$1" "$dir"\/"$(basename $1 .1)-$(date +'%Y%m%d_%H%M').1";
endscript
lastaction
find /log -type f -name "*.1" -exec bash -c 'gzip -nc "$1" > "${1:0:-2}.gz"; rm "$1"' _ {} \;
endscript
}
但我的文件是以GB为单位的。那么使用 copytruncate 选项可以吗?或者有其他替代方案。我能想到的一种解决方案是,使用预旋转脚本重命名文件而不是复制。
答案1
1)您的日志文件太大。在 crontab 中添加一个 logrotate 条目(每 5 分钟左右),使它们更小且更易于处理。
2)copytruncate 将复制(50GB 是很多),然后截断(ftruncate)文件到 0 字节。这需要时间,并且执行此操作时您将丢失记录。
3)尝试解析文件并删除不必要的信息(例如字段描述 - 创建标头)并仅保留值,以逗号(或其他标记)分隔。
最佳选择:
- 更高的频率。
- 没有复制截断。
-kill -HUP 重新读取conf文件的进程。
- 旋转 1。
- 压缩。
- 将 gzip 压缩的日志文件移动到安全位置