logrotate cron job不能旋转某些日志

时间:2013-03-27 05:49:27

标签: logging cron cron-task logrotate log-rotation

我在“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

第一个回声声明正在发挥作用 但我发现单独的应用程序日志没有被轮换,而像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

6 个答案:

答案 0 :(得分:14)

SELinux限制了对没有所需SELinux文件上下文类型的目录中的日志文件的logrotate访问。 “/ var / log”目录有“var_log_t”文件上下文,而logrotate能够做到需要。所以解决方案是在我的应用程序日志文件和它的父目录上设置它:

semanage fcontext -a -t var_log_t <directory/logfile>
restorecon -v <directory/logfile>

答案 1 :(得分:5)

我有类似的问题。为了解决这个问题,我首先使用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>

答案 2 :(得分:2)

只是为了概括上述内容并确保为所有未来文件正确设置相同的SELinux上下文:

semanage fcontext -a -t var_log_t "<directory>(/.*)?"
restorecon -v <directory>

答案 3 :(得分:1)

  

SELinux阻止/ usr / sbin / logrotate对目录网站进行读访问。

     

*****插件捕获(100.置信度)建议***************************

     

如果您认为默认情况下应允许logrotate对sites目录进行读访问。   然后你应该把它报告为一个bug。   您可以生成本地策略模块以允许此访问   做
  现在允许此访问:执行:

# grep logrotate /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp

答案 4 :(得分:1)

我最近遇到了与SELinux相关的类似问题,logrotate无法按预期对文件进行操作,这是在要轮换的日志位于NFS共享上时发生的。

在这种情况下,设置logrotate_use_nfs seboolean似乎可以解决问题,例如

$ setsebool logrotate_use_nfs 1
$ getsebool logrotate_use_nfs
logrotate_use_nfs --> on

答案 5 :(得分:0)

我已经看到禁用SELINUX的这个问题,这是因为正在轮换的日志文件的父目录具有全局写权限,而logrotate不欢迎

.navbar-nav > ul > li > a {
  color: inherit;
  text-decoration: none;
  /* pointer-events: none; */        /* remove this to make it clickable*/
  display:block;               /* add this */
}

chmod父目录到755解决了问题

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.