各种 Debian 软件包,包括logrotate
和rsyslog
,将它们自己的日志轮换定义放在/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,因为备份是一件好事。