如何正确覆盖 logrotate 策略?

Tob*_*bia 8 logrotate debian configuration

各种 Debian 软件包,包括logrotatersyslog,将它们自己的日志轮换定义放在/etc/logrotate.d/

覆盖这些定义的正确方法是什么?

如果我修改文件,我会在每次系统更新时收到警告,如果我(或其他人)给出错误答案,我可能会丢失更改;否则,如果我(或其他人)无法手动合并文件,则可能无法获得新日志文件的新上游定义。这两件事在过去几年中经常发生。

我尝试覆盖00_*zz_*文件中的定义,但出现重复错误:

error: zz_mail:1 duplicate log entry for /var/log/mail.log
error: found error in /var/log/mail.log , skipping
Run Code Online (Sandbox Code Playgroud)

有没有干净的解决方案?我应该每天编写一个 cron 脚本来重新应用我对定义文件的更改吗?


编辑:为了更清楚,理想情况下我希望保留 99%rsyslog的日志轮换定义,并使用 APT 自动更新。除了 的单个定义之外,/var/log/mail.log我需要对其应用不同的轮换策略。

如果 Logrotate 允许重复定义,并且每个文件只使用第一个或最后一个,我的问题就解决了。如果它有一个override选项,将一个定义标记为故意覆盖前一个定义,那也可以解决它。

但是,唉,看来我需要用我自己的版本覆盖整个/etc/logrotate.d/rsyslog(和nginx,以及其他)。

Ste*_*itt 7

首先,我建议使用一种工具,例如etckeeper跟踪 中文件的更改/etc;避免升级过程中的数据丢失(以及其他好处)。

覆盖定义的“正确”方法直接编辑配置文件;这就是为什么dpkg知道如何处理配置文件并在升级引入更改时提示您的原因。不幸的是,这并不理想,正如您所发现的。

要真正解决您的特定配置的问题,在一个Debian友好的方式,我真的建议你登录邮件到不同的日志文件,并设置起来logrotate

  • 在 中添加一个新的日志配置文件/etc/rsyslog.d,指向mail.*一个新的日志文件,例如 /var/log/ourmail.log(假设您正在使用rsyslog— 根据需要进行更改);
  • 配置/var/log/ourmail.log一个新的logrotate配置文件。

由于这仅涉及添加新的配置文件,因此不存在升级问题。现有的日志文件仍将使用默认配置生成和轮换,但您的日志文件将遵循您的配置。


Rui*_*iro 6

在 Debian 中,将配置/二进制文件的副本与发行版的默认设置不同的一种方法是“转移”文件。例如,在安装/更新任何 deb 包的新版本时告诉包管理器,将特定文件安装到另一个目录。

多年来,我一直在使用该dpkg-divert功能为 BIND 和 ISC-DHCP 保留一个 init.d sys V 包装器,它检查 DNS 和 DHCP 配置文件的一致性,并在重新启动服务时自动增加更改文件区域的序列号绑定。

我还在我的 nfsen 服务器中使用它来保存为我编译的二进制版本,而不是 deb 包的版本。

这样,您就可以根据自己的喜好修改原始位置。

可以说,我根据自己的喜好管理了太多系统,并更改了文件系统配置的标准位置 - 因此在一些更深奥的配置中使用此功能,我不希望修改被压缩但仍希望从升级中受益。

您甚至可能已经在默认情况下使用了 Debian 使用的文件转移,只需使用以下命令列出它们:

dpkg-divert --list
Run Code Online (Sandbox Code Playgroud)

man dpkg-divert

例子

   To  divert  all  copies  of  a /usr/bin/example to /usr/bin/example.foo, i.e.
   directs  all  packages  providing   /usr/bin/example   to   install   it   as
   /usr/bin/example.foo, performing the rename if required:

   dpkg-divert --divert /usr/bin/example.foo --rename /usr/bin/example

   To remove that diversion:

   dpkg-divert --rename --remove /usr/bin/example

   To    divert    any   package   trying   to   install   /usr/bin/example   to
   /usr/bin/example.foo, except your own wibble package:

   dpkg-divert   --package   wibble   --divert   /usr/bin/example.foo   --rename
          /usr/bin/example

   To remove that diversion:

   dpkg-divert --package wibble --rename --remove /usr/bin/example
Run Code Online (Sandbox Code Playgroud)

另请参阅 Debian-Administration.org 站点用 dpkg-divert 替换二进制文件

显然,虽然该指令非常有用,但我不建议过度滥用它。

至于@Stephen Kitt 解决配置文件可能存在的问题,发生的情况是升级会触及转移的文件,如果配置有重大变化,例如,升级到新的 Debian 版本的可能性更大,守护进程获胜't boot,这种情况必须手动解决。此外,公平地说,即使没有转移配置文件,这种情况也可能发生。

dkpg-divert与其他 Linux 发行版相比,IMO是显示 Debian 包管理器真正灵活性的功能之一。