![当 Apache 仍在写入日志时,使用 logrotate 实用程序是否安全?](https://linux22.com/image/792988/%E5%BD%93%20Apache%20%E4%BB%8D%E5%9C%A8%E5%86%99%E5%85%A5%E6%97%A5%E5%BF%97%E6%97%B6%EF%BC%8C%E4%BD%BF%E7%94%A8%20logrotate%20%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%98%AF%E5%90%A6%E5%AE%89%E5%85%A8%EF%BC%9F.png)
我有一台 Apache 服务器mod_log_configmod 已启用。使用旋转日志一旦达到 1GB,它就会生成一个新的日志文件:
CustomLog "|/usr/sbin/rotatelogs /var/log/logs 1G"
最重要的是,为了节省一些磁盘空间,日志旋转一旦日志文件达到 100MB,脚本就会压缩它们:
/var/log/logs_* {
size 100M
compress
missingok
notifempty
rotate 7
copytruncate
maxage 7
}
它将产生以下结果:
logs_20240216 //uncompressed at it did not reached 100MB yet
logs_20240216.1.gz
logs_20240216.2.gz
logs_20240216.3.gz
logs_20240216.4.gz
使用安全吗?日志旋转压缩日志文件,而 Apache 当时仍然可以向其中写入数据?
我说的安全是指 Apache 或日志旋转将崩溃并且压缩文件将不会被损坏(例如:某些日志条目丢失或无法解压)。
答案1
是的,这是安全的,但您需要有正确的 logrotate 配置。不要轮换日志文件并让 apache 使用这些日志文件,而是让 apache 写入新的日志文件。例如像这样
/var/log/apache2/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 root adm
sharedscripts
postrotate
/etc/init.d/apache2 reload > /dev/null
endscript
}
这会在轮换后重新加载 Apache2,以确保使用新的日志文件。
答案2
我自己回答了这个问题:它不安全(至少使用 copy-truncate 时)。如果你写入大量数据,情况尤其如此(因为它增加了数据丢失的可能性)。
原因是复制截断是一个两步过程:首先复制文件,然后截断文件。在这期间,可能会将一些数据附加到文件中(这些数据将会丢失)。感谢 AlexD 指出这一点。
我发现的解决方案是不使用logrotate
实用程序,只使用压缩rotatelogs
LogFile "|/usr/sbin/rotatelogs -p '/path/to/compress.sh' /var/log/logs 1G"
文件内部compress.sh
:
#!/bin/bash
gzip "${2}"