我有一个应用程序每天生成一个非常重的大日志文件(每天大约800MB),因此我需要压缩它们但由于压缩需要时间,我希望logrotate在重新加载/发送HUP信号后压缩文件申请。
/var/log/myapp.log {
rotate 7
size 500M
compress
weekly
postrotate
/bin/kill -HUP `cat /var/run/myapp.pid 2>/dev/null` 2>/dev/null || true
endscript
}
压缩是在postrotate之后发生的吗(这会违反直觉)? 如果没有,任何人都可以告诉我,如果没有额外的命令脚本(一个选项或一些技巧)可以做到这一点吗?
由于 托马斯
答案 0 :(得分:40)
此处添加此信息,以防其他人在实际搜索时遇到想要在压缩完成后运行文件的方法时遇到此线程的情况。
如上所述使用 postrotate / endscript 对此没有好处。
相反,您可以使用 lastaction / endscript ,这可以完美地完成工作。
答案 1 :(得分:21)
postrotate 脚本始终在压缩之前运行,即使 sharedscripts 生效。因此,Hasturkun对第一个答案的额外回应是不正确的。当 sharedscripts 生效时, postrotate 之前执行的唯一压缩是针对由于 delaycompress 而留下的旧未压缩日志。对于当前日志,在运行 postrotate 脚本之后,始终 执行压缩。
答案 2 :(得分:15)
postrotate
脚本在压缩发生之前运行:来自logrotate的手册页
配置文件的下一部分定义了如何处理日志文件 在/ var / log / messages中。该日志将在之前进行五周轮换 被删除。日志文件旋转后(但在旧文件之前) 日志的版本已被压缩),命令/ sbin / killall -HUP syslogd将被执行。
在任何情况下,您都可以使用delaycompress
选项将压缩延迟到下一轮。
答案 3 :(得分:2)
@Hasturkun - 除非他们的声誉首先高于50,否则无法添加评论。
要确保logrotate会做什么,
使用postrotate的共享脚本配置
$ logrotate -d -f <logrotate.conf file>
显示以下步骤:
rotating pattern: /tmp/log/messages /tmp/log/maillog /tmp/log/cron
...
renaming /tmp/log/messages to /tmp/log/messages.1
renaming /tmp/log/maillog to /tmp/log/maillog.1
renaming /tmp/log/cron to /tmp/log/cron.1
running postrotate script
<kill-hup-script executed here>
compressing log with: /bin/gzip
compressing log with: /bin/gzip
compressing log with: /bin/gzip