logrotate无法正常压缩并删除syslog模板生成的apache.log文件
logrotate无法正常压缩并删除syslog模板生成的apache.log文件
看起来你的messages日志能正常被logrotate处理,但用RSYSLOG模板生成的apache.log却出了问题——旧日志有的没压缩,还保留了超过配置的4份,这确实挺头疼的。结合你的配置和现象,我来梳理几个大概率的原因和排查方向:
首先排查最可能的核心问题:RSYSLOG没正确释放旧日志的文件句柄
你用的是RSYSLOG的DynaFile动态模板生成apache.log,而messages是直接指定File的静态路径。普通的omfile收到HUP信号会自动切换到新日志文件,但DynaFile的处理逻辑不一样——可能你发的HUP信号没让RSYSLOG正确关闭旧的apache.log文件句柄。
如果旧日志文件一直被RSYSLOG占用着,logrotate就没法压缩或删除它,因为文件还处于被写入的状态。你可以这么验证:
- 执行
lsof /data/logs/apache.log-20231107(挑一个没被压缩的旧日志),看看输出里有没有rsyslogd进程拿着这个文件的句柄。如果有,那就是这个问题。
解决思路:
- 把postrotate里的HUP信号改成直接重启RSYSLOG,比如如果是systemd系统:
相比HUP,重启能彻底让RSYSLOG重新加载所有文件,包括动态生成的apache.log。postrotate systemctl restart rsyslog || true endscript - 或者试试给RSYSLOG的action配置加
CloseOnHUP="on"参数,强制它收到HUP时关闭所有打开的文件句柄:
注意这个参数的有效性取决于你的RSYSLOG版本,部分旧版本可能用action(type="omfile" DynaFile="apache_log" Template="RSYSLOG_SyslogProtocol23Format" DirCreateMode="0750" dirOwner="root" dirGroup="logs" FileCreateMode="0640" fileOwner="root" fileGroup="logs" CloseOnHUP="on")SignalOnClose替代。
其次,手动执行logrotate调试,看具体错误
有时候logrotate的问题光看现象猜不准,直接手动跑一遍调试模式能看到详细日志:
logrotate -v -f /etc/logrotate.d/syslog
这个命令会强制执行一次logrotate,并输出每一步的操作细节。重点看针对apache.log的部分,有没有类似“file is open by another process”或者“skipping compression”的提示,这些能直接定位问题。
最后检查logrotate全局配置和文件属性
- 确认
/etc/logrotate.conf里的compress是全局开启的,有没有针对apache.log的特殊排除规则(比如nocompress)。你提到默认配置里有compress,但保险起见还是核对下。 - 检查那些没被压缩的旧日志文件,有没有特殊属性(比如
chattr +i加了 immutable 锁),执行lsattr /data/logs/apache.log-20231107看看,如果有i属性,用chattr -i去掉就行。
备注:内容来源于stack exchange,提问作者giomanda
相关产品推荐
相关产品推荐

