当 Apache 仍在写入日志时,使用 logrotate 实用程序是否安全?

当 Apache 仍在写入日志时,使用 logrotate 实用程序是否安全?

我有一台 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}"

相关内容