And*_*ate 10 upstart init logrotate
我们使用 upstart 在我们的 Ubuntu 服务器上管理我们的服务。他们产生的日志被登出到 /var/log/upstart/SERVICE_NAME.log
然后每天使用 12.04 LTS 附带的 logrotation 脚本轮换日志文件:
/var/log/upstart/*.log {
daily
missingok
rotate 7
compress
notifempty
nocreate
}
Run Code Online (Sandbox Code Playgroud)
问题是,虽然 logrotate 移动文件,但它似乎没有向 upstart 发出关闭和重新打开文件的信号,让 upstart 进程写入删除 PID。
init 1 root 8w REG 202,1 64 2431 /var/log/upstart/dbus.log.1 (deleted)
init 1 root 13w REG 202,1 95 2507 /var/log/upstart/acpid.log.1 (deleted)
init 1 root 14w REG 202,1 127 17377 /var/log/upstart/whoopsie.log.1 (deleted)
init 1 root 36w REG 202,1 122 6747 /var/log/upstart/SERVICE_NAME.log.1 (deleted)
init 1 root 37w REG 202,1 30 6762
Run Code Online (Sandbox Code Playgroud)
显然,我可以将自己服务的输出重定向到其他日志文件,但问题仍然存在于系统进程中。此外,我宁愿不必建造比我需要的更多的基础设施。
我相信你有3个选择。
您通过添加“copytruncate”来修改现有配置
/var/log/upstart/*.log
{
copytruncate
daily
missingok
rotate 7
compress
notifempty
nocreate
}
如果您不能或(不允许)更改现有的 logrotate 配置,因为其他日志文件不会受到影响并且现有配置适用于它们,则将您的“SERVICE_NAME.log”文件移动到 / 下的新文件夹var/log 如果您愿意,可以使用“copytruncate”创建一个新配置并将其添加到 cron.daily。
a) 如果您不允许更改主机操作系统 logrotate 配置或添加到主机操作系统的 cron.daily,那么您的第三个选择是更改脚本或程序以在写入文件之前检查文件是否存在。b) 另一种方法是上面第 2 点的一点,即将日志文件移动到其他位置并在脚本或程序中执行特定于该程序日志文件的 logrotate 命令。
上面的第 3b 点更棘手,但更优雅,这是我大部分时间使用的,因为它意味着程序是自给自足和自我管理的,不需要操作系统的工作来照顾它。
要了解如何手动运行 logrotate 并将其添加到您的程序或脚本中,只需键入:
man logrotate
Run Code Online (Sandbox Code Playgroud)
或者
logrotate --help
Run Code Online (Sandbox Code Playgroud)
如果您的程序使用 Python,您可以查看该程序如何使用它来自我管理其日志文件。 http://bazaar.launchpad.net/~ferncasado/keep.awake/trunk/files/head:/v4/
事实证明,这是一个已知问题,当我输入此内容时,票证仍然处于打开状态。
正确的做法可能是完全删除所有/etc/logrotate.d/upstart
服务并分别轮换各个服务的文件。因为目录 ( /var/log/upstart/
) 只包含各种服务的 stdout/stderr ——并且任何旨在作为守护进程运行的服务根本不应该输出到这两个通道。也许除了在刚开始的时候。
在我管理的系统上,三个服务由 upstart 运行:php5.6-fpm
、php7.1-fpm
和acpid
。三个日志都不是活动的,但有时 fpm 由于其主日志文件 ( /var/log/php5.6-fpm.log
) 被轮换而重新启动——这会导致这种噪音,因为它在启动时输出一些空洞的信息。
如果您坚持要轮换这些文件,您可以相信它们的名称与服务名称匹配并使用以下postrotate
脚本:
postrotate
service=${1##*/}
service=${service%.log*}
service $service restart > /dev/null
endscript
Run Code Online (Sandbox Code Playgroud)
为了使上述工作正常进行,请确保不要在其中使用动词 - 我的 scriptlet 依赖于这样一个事实:文件的实际路径将作为第一个参数 ( sharedscripts
$1
) 传递给它。
(重定向到/dev/null
很有用,因为service
-command 很吵——而且你不希望 cron 通过电子邮件将这样的噪音发送给你。注意,我不会重定向stderr
到那里,只是stdout
——如果出现问题,你我仍然会收到您的电子邮件。)