rsyslog输出通道结合自定义权限配置后日志轮转新文件权限与所有者异常问题咨询
这个问题的核心是:rsyslog的$outchannel机制在触发自定义轮转脚本后,重新创建新日志文件时并没有继承你设置的$umask和$FileGroup全局配置,而是 fallback 到了默认的root权限。下面给你几个可行的解决思路:
方法1:在自定义轮转脚本中手动修正权限
既然你已经有了自定义轮转脚本,最简单的方式就是在脚本末尾添加修改文件属性的命令,确保新创建的mylog.log(rsyslog会自动创建)符合你的要求。比如在my-rotate-script.sh的最后加上:
# 修正新日志文件的组和权限 chown root:the-mothers-of-invention /path/mylog.log chmod 0640 /path/mylog.log
这样脚本执行完成后,直接将rsyslog刚创建的文件修改为你需要的属性,避免默认权限问题。
方法2:改用rsyslog现代的omfile Action配置(推荐)
$outchannel是rsyslog比较老旧的特性,现在更推荐使用omfile模块的原生轮转功能,它支持直接指定文件所有者、组、权限,并且每次轮转后创建新文件时都会自动应用这些配置,不需要依赖自定义脚本。
替换你原来的配置为以下内容(适用于rsyslog v8及以上,目前主流发行版都已支持):
# 定义日志文件路径模板 $template myLogPath,"/path/mylog.log" # 定义日志格式模板(和你原来的一致) $template myTemplate,"%timegenerated:1:23:date-rfc3339%+%timegenerated:28:36:date-rfc3339% %syslogpriority-text:1:2:uppercase%hostname%:%msg%\n" # 匹配MYAPP日志并设置输出规则 if $app-name == 'MYAPP' then { action( type="omfile" file=`myLogPath` template="myTemplate" fileOwner="root" # 设置你需要的所有者,比如root fileGroup="the-mothers-of-invention" # 目标组 fileMode="0640" # 目标权限 maxFileSize="10000000" # 10MB触发轮转 action.onOverflow="rotate" # 触发轮转动作 rotateNumberOfFiles="99" # 保留99个轮转文件 rotateSuffix=".log" # 轮转文件后缀 action.execOnlyWhenPreviousIsClosed="on" # 确保文件关闭后再轮转 ) stop }
这种方式的优势是所有配置都在rsyslog内完成,不需要维护外部脚本,且属性设置会被严格应用到每一个新创建的日志文件上。
方法3:为outchannel对应的omfile明确指定属性
如果你坚持要使用$outchannel,可以尝试在调用omfile时直接附加文件属性参数,强制rsyslog在重新创建文件时应用这些设置。修改你的规则行:
if $app-name == 'MYAPP' then { *.* :omfile:$rotate1;myTemplate fileGroup="the-mothers-of-invention" fileMode="0640" stop }
不过注意这个方法的兼容性可能不如方法2,不同rsyslog版本对outchannel配合omfile参数的支持可能有差异,建议先测试配置语法:
rsyslogd -N1
测试与验证
修改配置后,先检查语法无误,再重启rsyslog服务:
# 针对systemd系统 systemctl restart rsyslog # 针对sysvinit系统 service rsyslog restart
然后可以手动触发日志轮转(比如手动填满日志到10MB),验证新创建的mylog.log是否符合权限和组的要求。
内容的提问来源于stack exchange,提问作者carlitox1

