Ubuntu 20.04下Logrotate读取主配置与子配置文件行为差异及单份日志留存需求的问题排查
咱们一步步来捋清楚这个问题哈,你遇到的主配置和子配置运行结果不一致的情况,核心原因主要集中在权限配置冲突和全局配置的继承优先级上,下面给你详细拆解:
一、问题根源分析
全局
su指令与日志文件权限不匹配
你的主配置/etc/logrotate.conf里设置了全局的su root adm,但vmware-network.log及其归档文件的权限是-rw------- 1 root root——只有root用户拥有读写权限,adm组完全没有操作权限。当logrotate以root:adm的身份处理这些日志时,虽然用户身份是root,但组身份是adm,没法对root:root的文件执行删除、重命名等核心操作,只能退而求其次把日志文件截断为0大小,而不是按预期删除多余的归档日志。而单独运行子配置
/etc/logrotate.d/misc时,子配置里的su root root会覆盖全局的su设置,logrotate以root:root的身份操作,拥有完整权限,因此可以正常删除多余的归档日志,只保留一份主日志文件。全局周期配置的继承影响
主配置里的weekly会覆盖子配置的daily,虽然你用了-f强制运行忽略周期,但logrotate内部的“是否触发旋转”判断逻辑还是会受全局周期的间接影响,不过结合你的测试结果,这个是次要因素,权限问题才是核心。/var/log目录权限的安全告警
你之前遇到的parent directory has insecure permissions报错,是因为/var/log的权限是drwxrwxr-x(组可写),这不符合logrotate的安全检查逻辑,也会间接影响日志操作的执行。
二、解决方案
方案1:为每个子配置匹配正确的su指令
你已经在misc子配置里加了su root root,这个是对的,要确保所有子配置的su指令都和对应日志文件的用户组一致:
- 比如rsyslog的日志如果是
root:syslog,对应的子配置里要写su root syslog; - 主配置的
include /etc/logrotate.d要放在所有全局设置之后(你的配置已经是这样,没问题)。
方案2:调整全局su指令适配多数日志权限
如果你的大多数日志文件都是root:root或root:syslog,可以直接修改/etc/logrotate.conf里的全局su指令为su root root,这样全局运行时就不会有组权限冲突。不过要注意,个别服务的日志如果属于特殊组,还是要在子配置里单独覆盖su设置。
方案3:修复/var/log目录的权限
先解决目录权限的安全告警,把/var/log调整为更严格且合理的权限:
sudo chmod 755 /var/log
这个权限(root可读写执行,其他用户只读)不会影响syslog等服务写入日志,还能消除logrotate的权限报错。
三、验证步骤
- 先执行目录权限修复:
sudo chmod 755 /var/log - 检查所有子配置的
su指令是否匹配对应日志的用户组; - 用主配置强制测试:
sudo logrotate -fv /etc/logrotate.conf - 查看
/var/log/下的vmware-network.*.log,应该只保留一份主日志文件,其他归档文件被删除。
如果还是有问题,可以用调试模式查看详细执行过程(不会实际修改文件):
sudo logrotate -dv /etc/logrotate.conf
从输出里找具体的权限报错或操作失败提示,就能定位剩余问题了。
备注:内容来源于stack exchange,提问作者Bagheriovsky

