logrotate cron 作业不旋转某些日志
Posted
技术标签:
【中文标题】logrotate cron 作业不旋转某些日志【英文标题】:logrotate cron job not rotating certain logs 【发布时间】:2013-03-17 04:02:23 【问题描述】:我在“logrotate.d”目录中添加了两个脚本,用于轮换我的应用程序日志。 这是其中之一的配置:
<myLogFilePath>
compress
copytruncate
delaycompress
dateext
missingok
notifempty
daily
rotate 30
“cron.daily”目录中有一个“logrotate”脚本(根据 cron 日志,它似乎每天都在运行):
#!/bin/sh
echo "logrotate_test" >>/tmp/logrotate_test
#/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
/usr/sbin/logrotate -v /etc/logrotate.conf &>>/root/logrotate_error
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
第一个 echo 语句正在运行。但我发现我的应用程序日志没有单独轮换,而其他日志(如 httpd)正在轮换** **而且我在提到的“logrotate_error”文件中也看不到任何输出(对所有用户都有写权限)。
但是系统日志显示:“logrotate:ALERT 异常退出 [1]”
但是当我在“cron.daily”脚本中手动运行相同的“logrotate”时,一切似乎都正常。
为什么它在每日 cron 计划中不轮换?我在这里做错了吗? 如果我能得到这么急需的帮助,那就太好了。
更新: 看起来,这是因为 selinux - 我的用户主目录中的日志文件受到 selinux 和 logrotate 脚本运行时间的限制:
SELinux is preventing /usr/sbin/logrotate from getattr access on the file /home/user/logs/application.log
【问题讨论】:
【参考方案1】:SELinux 限制了对不具有所需 SELinux 文件上下文类型的目录中日志文件的 logrotate 访问。 "/var/log" 目录有 "var_log_t" 文件上下文,并且 logrotate 能够做到这一点。所以解决方案是在我的应用程序日志文件和它的父目录上设置它:
semanage fcontext -a -t var_log_t <directory/logfile>
restorecon -v <directory/logfile>
【讨论】:
【参考方案2】:我遇到了类似的问题。为了解决这个问题,我首先使用 sestatus 命令检查了 SELinux 的状态:
# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted
然后,使用 ls --scontext 检查应用于文件和目录的 SELinux 安全上下文。检查你希望 logrotate 操作的文件,并检查正在工作的文件,例如 /var/log/maillog:
# ls --scontext /var/log/maillog*
system_u:object_r:var_log_t:s0 /var/log/maillog
system_u:object_r:var_log_t:s0 /var/log/maillog-20140713
system_u:object_r:var_log_t:s0 /var/log/maillog-20140720
system_u:object_r:var_log_t:s0 /var/log/maillog-20140727
system_u:object_r:var_log_t:s0 /var/log/maillog-20140803
使用 semanage 更改文件上下文。
semanage fcontext -a -t var_log_t <directory/logfile>
restorecon -v <directory/logfile>
【讨论】:
【参考方案3】:只是概括上述内容并确保为所有未来文件正确设置相同的 SELinux 上下文:
semanage fcontext -a -t var_log_t "<directory>(/.*)?"
restorecon -v <directory>
【讨论】:
【参考方案4】:我最近遇到了类似的与 SELinux 相关的问题,logrotate
未按预期对文件进行操作,当要轮换的日志位于 NFS 共享上时会发生这种情况。
在这种情况下,设置 logrotate_use_nfs
seboolean 似乎可以解决问题,例如
$ setsebool logrotate_use_nfs 1
$ getsebool logrotate_use_nfs
logrotate_use_nfs --> on
【讨论】:
【参考方案5】:SELinux 正在阻止 /usr/sbin/logrotate 对目录站点进行读取访问。
***** Plugin catchall (100. confidence) 建议 ***************************
如果您认为默认情况下应该允许 logrotate 对站点目录进行读取访问。 然后你应该将此报告为错误。 您可以生成一个本地策略模块来允许此访问。 做 现在通过执行允许此访问:
# grep logrotate /var/log/audit/audit.log | audit2allow -M mypol # semodule -i mypol.pp
【讨论】:
这是从哪里获取的?请问可以添加吗?我用谷歌搜索了这个,我看到很多类似的消息,但我找不到来源。这是 SELinux 给出的默认消息吗?【参考方案6】:我在 SELINUX 禁用的情况下看到了这个问题,这是因为被轮换的日志文件的父目录具有全局写入权限,而 logrotate 不欢迎
error: skipping "/xxx/yyy/log/logfile.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
chmod 父目录到 755 解决了这个问题
# logrotate --version
logrotate 3.8.6
【讨论】:
以上是关于logrotate cron 作业不旋转某些日志的主要内容,如果未能解决你的问题,请参考以下文章