我在中央 syslog 服务器上遇到了一个非常奇怪的问题,即 logrotate 和 syslog 文件。发生的情况是,执行 logrotate 时,syslog 模板生成的文件不会被压缩或删除。其他文件会按预期压缩和轮换。
syslog 模板示例:
template(name="apache_log" type="string"
string="/data/logs/apache.log")
if $syslogtag startswith '(httpd' then {
action(type="omfile" DynaFile="apache_log" Template="RSYSLOG_SyslogProtocol23Format"
DirCreateMode="0750" dirOwner="root" dirGroup="logs"
FileCreateMode="0640" fileOwner="root" fileGroup="logs")
stop
}
local2.* action(name="local2_messageslog" type="omfile" File="/data/logs/messages")
logrotate示例:
$cat /etc/logrotate.d/syslog
/data/logs/messages
/data/logs/apache.log
{
sharedscripts
missingok
daily
rotate 4
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
问题:
-rw-r----- 1 root logs 2910357960 Nov 9 03:53 messages
-rw-r----- 1 root logs 1725989639 Nov 6 00:01 messages-20231106.gz
-rw-r----- 1 root logs 1852598019 Nov 7 00:01 messages-20231107.gz
-rw-r----- 1 root logs 2209372695 Nov 8 00:01 messages-20231108.gz
-rw-r----- 1 root logs 2036382265 Nov 9 00:01 messages-20231109.gz
-rw-r----- 1 root logs 82458243 Nov 9 03:53 apache.log
-rw-r----- 1 root logs 501509524 Nov 1 00:01 apache.log-20231101
-rw-r----- 1 root logs 596170609 Nov 2 00:00 apache.log-20231102
-rw-r----- 1 root logs 528313043 Nov 3 00:00 apache.log-20231103
-rw-r----- 1 root logs 475893564 Nov 4 00:00 apache.log-20231104
-rw-r----- 1 root logs 26731791 Nov 5 00:00 apache.log-20231105.gz
-rw-r----- 1 root logs 26634166 Nov 6 00:01 apache.log-20231106.gz
-rw-r----- 1 root logs 518016884 Nov 7 00:01 apache.log-20231107
-rw-r----- 1 root logs 507646042 Nov 8 00:01 apache.log-20231108
-rw-r----- 1 root logs 501009363 Nov 9 00:00 apache.log-20231109
“消息”日志文件按预期轮换和压缩。只有 4 个轮换文件。但是,对于 apache 日志(syslog 模板化文件),有些文件已压缩,有些则未压缩。此外,有些日志文件已有 8 天的历史。Logrotate 配置为仅保留 4 天。有什么想法可能导致此行为?
Apache 日志来自另一个系统。本地没有运行 Apache 进程。
ps. logrotate 默认文件上设置了 compress 指令
答案1
您正在向 posprocessing 阶段的 syslogd 进程发送 HUP 信号,以指示守护进程应重新加载配置并开始写入新消息文件,但您没有对 apache 执行相同的操作。如果您使用的是 systemd(如果不是,则应使用 /etc/init.d/apache2 reload),则应使用类似于以下的 postrotate 部分
postrotate
systemctl reload apache2
在某些系统中,apache 服务不是 apache2,而是 httpd