如何正确覆盖 logrotate 策略?

如何正确覆盖 logrotate 策略?

各种 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

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


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

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

但可惜的是,我似乎需要用我自己的版本覆盖整个/etc/logrotate.d/rsyslog(以及其他)。nginx

答案1

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

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

为了实际解决您的特定配置问题,以 Debian 友好的方式,我建议您将邮件消息实际记录到不同的日志文件中,并设置位于logrotate

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

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

答案2

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

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

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

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

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

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

dpkg-divert --list

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

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

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

至于@Stephen Kitt 的地址可能的配置文件有问题,发生的情况是升级将触及转移的文件,并且如果配置有重大更改,例如,升级到新的 Debian 版本的可能性更大,守护进程将无法启动,这种情况必须手动解决。另外,公平地说,即使没有转移配置文件,这种情况也可能发生。

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

答案3

正如斯蒂芬所说,您必须直接编辑配置文件,但这并不意味着您必须将自定义指令放在那里。

编辑/etc/logrotate.d/rsyslog在现有指令的末尾添加一行,其中包含一个包含您自己的覆盖指令的单独文件:

/var/log/syslog
{
        ... existing directives ...

        include /etc/logrotate.d/override/rsyslog
}

然后创建您的覆盖文件,其中仅包含您的覆盖指令:

/etc/logrotate.d/override/rsyslog

weekly
rotate 0

在系统升级过程中你仍然需要注意,但是再次修补软件包提供的默认配置非常简单:只需添加一行即可。

对我来说,这是一个可以接受的妥协,因为至少它使我免于手动合并每次系统升级时的差异,同时保持我的系统标准兼容、清晰和易于理解。

答案4

让我们回过头来思考一下更改的配置文件警告。为什么会得到它,它意味着什么?这是一件好事吗?

在大多数情况下,Debian 附带的默认配置文件主要执行所需的操作。他们可以通过两种方式进行更改:管理员或打包者更改它们。两者之一都是正常且符合预期的,但如果两者都是正确的做法是什么?理想情况下,两者都会进行相同的更改并且可以合并,但即使这样也很难做到,而且我从未见过这种情况发生。在大多数情况下,您需要记下打包程序所做的更改,并逐行接受、合并或拒绝它们。迄今为止,只有一种方法可以以有限的方式做到这一点,那就是配置片段的目录,它允许以简单的方式添加附加内容,但不能更改或删除,并且仍然不如预期有用如果发生重大变化,请接受警告,认真对待并花点时间比较变化,以便您可以做正确的事情。

也就是说,在您的具体情况下(因为这是一个微小的更改),我将禁用有问题的片段(通过撤销所有读取权限、转移它或重命名)并创建一个具有不同名称的新片段。我还建议使用 etckeeper,因为备份是一件好事。

相关内容