我正在尝试为 Linux 中的应用程序创建单独的日志文件。到目前为止,我已经创建了一个 .conf 脚本,用于根据程序名称将日志分离到自定义日志文件中,并且它运行正常。
但是,我想将日志文件的大小限制为 10K,并且我正$outchannel
为此使用。脚本存储为/etc/rsyslog.d/00-abc_log.conf
:
$outchannel o_abc, /var/log/abc.log, 10240, /home/xyz/logrot
if $programname == 'abc' then :omfile:$o_abc
脚本/home/xyz/logrot
包含以下内容:
mv -f /var/log/abc.log /var/log/abc.log.1
在 10K 限制以下,日志记录工作正常,但在日志超过 10K 大小限制后,不会生成文件 abc.log.1,并且 abc.log 中的日志记录停止。
如果重要的话,我的系统正在运行 Xubuntu 12.04 rsyslog-5.8.6
。
提前致谢。
答案1
出现问题的原因是,在将文件描述符移到文件系统后,应用程序仍打开该文件描述符。除非您可以告诉程序在移动后直接重新启动日志记录(通常对于守护进程,会有一个信号,如SIGHUP
),否则您将不得不使用另一种方法进行轮换,而不是将文件移动到当时写入的位置
我建议使用logrotate
如下方法。尚未测试,因为您尚未分享所涉及的应用程序。
创建您自己的 logrotate 配置文件,例如abclogrotate.conf
:
/var/log/abc.log {
# don't use time based rotation, but size-based
size 10k
# don't move, but copy-and-truncate so the application won't have to be
# told that the file has moved.
copytruncate
# maximum of one old file
rotate 1
# counting old files starts at 1 rather than 0
start 1
# don't use compression
nocompress
}
现在像这样调用 logrotate:logrotate /path/to/abclogrotate.conf
而不是您自己的脚本。