2011-09-01 117 views
11

我有一个应用程序生成一个真正沉重的大日志文件(每天〜800MB),因此我需要压缩他们,但由于压缩需要时间,我希望该logrotate压缩文件在重新加载/发送HUP信号到应用程序之后。后postrotate脚本后logrotate压缩文件

/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之后(这会违反直觉)? 如果没有任何人可以告诉我,如果没有额外的命令脚本(一个选项或一些技巧)可以做到这一点?

感谢 托马斯

回答

11

压缩发生前postrotate脚本并运行:从该名男子页logrotate

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

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

+2

谢谢,我应该更仔细地阅读man页面......虽然这些信息也应该是compress选项的解释下。 – Thomas

+1

@Thomas:请注意'sharedscripts'使'postrotate'脚本在压缩后运行,如果您使用的是 – Hasturkun

+1

请注意所有读者,根据以下答案,上述评论似乎是错误的@ jw-padded-to-three -chars,请参考后者。 – Thomas

19

postrotate脚本总是运行以前压缩,即使sharedscripts生效。因此,Hasturkun对第一个答案的额外回应是不正确的。当共享脚本生效时,在追赶之前执行的唯一压缩是由于延迟压缩而导致旧的未压缩日志左侧。对于当前日志,压缩是总是执行运行postrotate剧本。

+0

我刚刚发现了这个。同意@Hasturkun应该修改或删除他的评论。 – mateolargo

+2

如果这是一个评论,我可能会在不到八个月的时间内回复 – Hasturkun

31

如果遇到任何其他人在实际搜索想要在压缩完成后在文件上运行脚本的方法时遇到此问题,请在此处添加此信息。如上所述,使用postrotate/endscript对此没有好处。相反,你可以使用lastaction/endscript,它完美地完成了这项工作。

+0

你是男人。至少为我节省了30分钟的搜索/阅读。 –

2

@Hasturkun - 除非声望高于50,否则不能添加评论。

要确保的是什么logrotate的会做,要么

  1. 测试您的配置,-d:调试其测试,但没有做任何事情 ,和-f:强制运行
  2. 或你可以用 执行日志轮播的-v详细标志

与使用sharedscript为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 
+0

假设你指的是我的(收回的)评论,IIRC(从那以后已经有一段时间了)我在错误出现时检查了logrotate源。这确实是错误的,行为不受影响。无论如何,测试你的配置可能是一个好主意。 – Hasturkun