使用rsyslog限制日志文件大小,outchannel实现自动回滚rotate

最近在使用rsyslog进行日志的集中管理,需要限制服务器的日志文件大小,让它在达到一定大小后自动rotate。发现outchannel能实现这种需求,遂查阅rsyslog rotation官方文档(也可执行$man rsyslog.conf查看本地手册中的OUTPUT CHANNELS部分,通常这种方法更有参考价值),依葫芦画瓢做了以下配置:

--------------------------------
在/etc/rsyslog.d/50-default.conf文件中添加下面两行:
$outchannel log_rotation,/var/log/mylogs/logfile.log, 500,/var/log/mylogs/rotate_script.sh /var/log/mylogs/logfile.log
local1.* $log_rotation
(红字意思是:执行rotate_script.sh脚本时附加logfile.log的绝对路径作为参数)
并新建/var/log/mylogs/rotate_script.sh脚本文件,内容只有一行:
mv -f ${1} ${1}.1
(接收文件名参数,将logfile.log文件move到logfile.log.1)
---------------------------------

本以为大功告成,乐呵呵地重启rsyslog服务开始测试。结果发现,每当logfile.log超过500B后,总是卡在那里不动了,新来的日志再也插不进去,logfile.log.1文件也没创建出来。

想来想去,应该是卡在了执行脚本的地方。outchannel在检测到内容超出指定大小时,执行mv命令失败。是文件权限的问题吗?由于本人Linux知识极端匮乏,在对文件权限胡乱更改一通之后,宣告失败。不过最后还是在网上搜到了解决办法,问题确实出在文件权限上。方向没找错,但解决问题的手段实在拙劣(惭愧。。。)。

rsyslog内部指定了对哪种文件有操作权限,在rsyslog.conf中能够找到下面几行配置:

$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

前两行即指明rsyslog所操作的文件其所有者是syslog、所在组是adm,关键就在这里!据此更改日志文件的权限。

chown -R syslog:adm /var/log/mylogs
chmod -R g+w /var/log/mylogs
chmod ug+x /var/log/mylogs/rotate_script.sh

然后重启rsyslog服务,测试,It all works!新日志总是输出到logfile.log,当大小超出500B就rotate,把旧日志放入logfile.log.1(覆盖)同时logfile.log清空,接收新日志,如此重复。

在看rsyslog文档时还看到2009年时官方提出停用outchannel的计划,因而现在做好的配置在更高版本的rsyslog中都有可能失效。不过也不必担心,就算有别的模块取代outchannel也会提供相同的功能,因为log rotation的需求是不可避免的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值