14

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

6 回答 6

16

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

semanage fcontext -a -t var_log_t <directory/logfile>
restorecon -v <directory/logfile>
于 2013-05-24T18:19:39.397 回答
7

我有一个类似的问题。为了解决这个问题,我首先使用 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>
于 2014-08-05T16:43:58.620 回答
2

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

semanage fcontext -a -t var_log_t "<directory>(/.*)?"
restorecon -v <directory>
于 2015-04-29T09:20:48.953 回答
2

我最近遇到了一个与 SELinux 相关的类似问题,logrotate即未按预期对文件进行操作,当要旋转的日志位于 NFS 共享上时,就会发生这种问题。

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

$ setsebool logrotate_use_nfs 1
$ getsebool logrotate_use_nfs
logrotate_use_nfs --> on
于 2018-10-22T09:15:16.830 回答
1

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

***** 插件包罗万象(100。信心)建议 ***************************

如果您认为默认情况下应该允许 logrotate 对站点目录进行读取访问。然后你应该将此报告为错误。您可以生成本地策略模块以允许此访问。
通过执行以下命令暂时
允许此访问:

# grep logrotate /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
于 2017-03-08T19:09:43.707 回答
0

我已经看到禁用 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
于 2016-05-17T12:53:19.250 回答