Ubuntu配置logrotate时出现<log>.gz打开错误的技术求助
我来帮你一步步排查这个Ubuntu上logrotate的报错问题,先理清楚你的配置和环境:
你的配置与环境
logrotate配置文件 /etc/logrotate.d/test
/var/log/test/*.log{ weekly rotate 7 compress delaycompress notifempty create 640 testuser testgroup }
目标日志目录 /var/log/test/ 的文件情况
所有日志文件都是空文件(大小0),属主属组为 testuser:testgroup。
运行logrotate时出现 logrotate: error opening <log>.gz 的错误,下面是可能的原因和对应的解决步骤:
排查与解决方案
1. 先看详细调试日志,定位具体问题
首先用调试模式运行logrotate,这样能看到每一步的执行细节,精准找到哪个文件出问题、为什么出问题:
sudo logrotate -d -f /etc/logrotate.d/test
-d 是调试模式(不会实际修改文件),-f 强制触发轮转,输出里会明确显示报错的文件和具体错误原因,这是排查的第一步。
2. 检查日志目录的权限
logrotate默认以root身份运行,虽然root权限很高,但如果/var/log/test/目录的权限过于严格,可能导致压缩后的.gz文件无法正常创建或读取。
先查看目录权限:
ls -ld /var/log/test
正常来说,目录权限至少要设置为 750,属主属组可以是 testuser:testgroup 或者 root:testgroup,保证root能读写该目录。如果权限是700且属主是testuser,可以调整权限:
sudo chmod 750 /var/log/test
3. 空文件导致的压缩异常
你设置了notifempty,理论上应该跳过空文件,但手动强制轮转(-f)时可能会忽略这个规则,尝试处理空文件。而空文件压缩后可能出现读取异常。
可以先给其中一个日志文件写入点内容测试:
echo "test log content" >> /var/log/test/2018-04-01.log
然后再运行logrotate:
sudo logrotate -f /etc/logrotate.d/test
如果不报错,说明是空文件的问题。可以在配置里添加minsize 1,确保只有大于1字节的文件才会被轮转压缩,修改后的配置如下:
/var/log/test/*.log { weekly rotate 7 compress delaycompress notifempty minsize 1 create 640 testuser testgroup }
另外,配置里{前最好加个空格,虽然logrotate可能兼容,但规范写法能避免潜在的语法解析问题。
4. 检查压缩工具是否正常
logrotate默认用gzip压缩日志,先手动测试gzip是否能正常工作:
sudo gzip /var/log/test/2018-04-01.log sudo gunzip /var/log/test/2018-04-01.log.gz
如果这两步报错,说明gzip有问题,可以重新安装gzip修复:
sudo apt update && sudo apt reinstall gzip
5. AppArmor权限限制
Ubuntu默认启用AppArmor,可能限制了logrotate在/var/log/test/目录下创建或读取压缩文件。
可以临时关闭AppArmor测试:
sudo systemctl stop apparmor
然后再运行logrotate,如果问题解决,就需要修改AppArmor规则:
编辑/etc/apparmor.d/usr.sbin.logrotate,添加以下内容:
/var/log/test/*.log rw, /var/log/test/*.log.gz rw,
保存后重新加载AppArmor:
sudo systemctl reload apparmor
内容的提问来源于stack exchange,提问作者suanziliu

