18

我有一个应用程序每天生成一个非常重的大日志文件(每天约 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
}

压缩是否已经发生在后旋转之后(这会违反直觉)?如果没有,谁能告诉我是否可以在没有额外的命令脚本(一个选项或一些技巧)的情况下做到这一点?

谢谢托马斯

4

4 回答 4

51

在此处添加此信息,以防其他任何人在实际搜索想要在压缩完成后在文件上运行脚本的方法时遇到此线程。

如上所述,使用postrotate/endscript对此没有好处。

相反,您可以使用lastaction/endscript,它可以完美地完成这项工作。

于 2012-08-22T11:28:27.603 回答
24

即使sharedscripts生效, postrotate脚本也总是在压缩之前运行。因此,哈斯图昆对第一个答案的附加反应是不正确的。当sharedscripts生效时,在postrotate之前执行的唯一压缩是针对由于delaycompress而留在周围的旧未压缩日志。对于当前日志,总是在运行postrotate脚本后执行压缩。

于 2011-11-12T01:47:21.320 回答
16

postrotate脚本在压缩发生之前运行:来自logrotate的手册页

配置文件的下一部分定义了如何处理日志文件 /var/log/messages。日志将在被删除之前每周轮换五次。在日志文件被轮换后(但在旧版本的日志被压缩之前),命令 /sbin/killall -HUP syslogd 将被执行。

在任何情况下,您都可以使用该delaycompress选项将压缩推迟到下一次旋转。

于 2011-09-01T14:46:02.447 回答
2

@Hasturkun - 除非他们的声誉首先超过 50,否则无法添加评论。

为了确保 logrotate 会做什么,要么

  1. 测试你的配置,-d:调试哪些测试但不做任何事情,-f:强制它运行
  2. 或者您可以使用 -v 详细标志执行 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
于 2013-09-18T20:10:33.917 回答