由于非 root 所有权,Logrotate 不再读取符号链接配置文件

由于非 root 所有权,Logrotate 不再读取符号链接配置文件

我们目前正在将 ruby​​ on rails 应用服务器上的 Ubuntu 12.04 LTS 升级到 14.04 LTS,并且注意到日志文件不再轮换。

/var/app-name/config/logrotate在两台机器上,我们都有一个由我们的 unix 用户拥有的文件deployer,其中包含一个有效的 logrotate 文件,如下所示:

/var/app-name/log/*.log {
  daily
  rotate 365
  delaycompress
  compress
  dateext
  dateformat -%Y%m%d
  missingok
  copytruncate
}

然后将其符号链接到/etc/logrotate.d/目录中,如下所示app-name

在我们的 Ubuntu 12.04 服务器上,我们安装了 logrotate 3.7.8,它运行良好。它进入var/app-name/log/目录并轮换所有日志文件

但是在 Ubuntu 14.04 服务器上,我们有 logrotate 3.8.7,它不会轮换我们的应用程序的日志文件。

当我通过调试它时,sudo logrotate -d -f /etc/logrotate/.conf我得到以下输出:

Ignoring /etc/logrotate.d/app-name because the file owner is wrong (should be root).

在代码中追踪这一点,似乎这个变化是为 3.8.x 发布流添加的:https://github.com/demands/logrotate/commit/b8ce386a969c60e5c8ee78023c24a1ba0aab1526

如果我将符号链接到的文件的所有权更改/var/app-name/config/logrotateroot,它就会重新开始工作。但考虑到此文件是我应用程序的一部分,并且由我们在此状态下使用的 Capistrano 部署框架创建,我宁愿不必改变它的所有权,因为它以前工作得很好。

那么 logrotate 是否推荐/支持符号链接配置文件?

如果是这样,那么拒绝使用符号deployer链接到/etc/logrotate.d目录中的我的文件(由拥有)是否应该被视为错误?

或者是否有另一种针对特定应用程序的日志轮换的推荐方法?

(还询问unix StackExchange

答案1

问题是 logrotate 配置文件可以运行任何deployer命令为 root(使用 prerotate/postrotate 节)。因此,通过授予用户对 中的文件的写访问权限,您实际上将授予用户root 权限/etc/logrotate.d/。所以,这不是错误。

如果您信任部署者用户,那么我想您可以通过授予其将文件复制到的 sudo 权限来解决问题/etc/logrotate.d/。当然,假设部署者用户与运行 Web 应用程序的用户不同。

答案2

我意识到我有点迟到了,但我遇到了类似的问题并想分享我的解决方案。

我的问题始于logrotate无法读取我编写的配置。我不想将新配置部署到 root 拥有的文件夹中,因为我不想让部署用户拥有 root 访问权限任何事物

起初我尝试以logrotate部署用户身份运行,但它抱怨无法访问 处的状态文件/var/lib/logrotate/state。然后我阅读了手册页。您可以指定logrotate使用的状态文件!因此,对我来说,设置一个每日 cron 以logrotate部署用户身份使用自定义状态文件执行似乎是一个更好的解决方案。这样,部署用户或应用程序就不需要 root 访问权限了。

指定状态文件的方法如下:

logrotate --state /path/to/status /path/to/custom_logrotate.conf

现在您可以以您喜欢的任何用户和配置所有者的身份运行 logrotate!

相关内容