logrotate切割日志后,新的日志还是写入到老的日志文件中

线上生产环境中,安装了dnsmasq,并记录日志。由于每一次dns查询都会生产日志,考虑到日志量越来越大,就用logrotate做日志轮转。配置如下:

1
2
3
4
5
6
7
8
9
10
/var/log/dnsmasq/dnsmasq .log {
         daily      // 按天轮转日志
         rotate 15  // 保留15个log文件
         compress   // 压缩轮转后的文件
         delaycompress 
         dateext
         missingok
         notifempty
         create 0664 root root
}


配置后,用logrotate -f /etc/logrotate.d/dnsmasq 测试成功

1
2
3
4
[root@SRV-OPS10-DNS01 logrotate.d] # ls -l /var/log/dnsmasq/            
total 8
-rw-r----- 1 root root    1 May  9 17:55 dnsmasq.log
-rw-r----- 1 root root 1092 May  9 17:45 dnsmasq.log-20170509


但是新问题是,虽然日志被切断了,但是新的log不会写入到新的dnsmasq.log中,而是继续写入到dnsmasq.log-20170509中。


进过上网查资料发现,原因是:

虽然logrotate只是重命名了当前log,删了旧log,但是rsyslog不知道,打开的文件还是旧文件嘛。当然写的就是旧文件了。


解决办法:

网上查下来有以下两种解决办法:我只尝试了第一种,成功了。

1.加入copytruncate参数,拷贝后截断。

原理:可以理解为把内容拷贝走作为备份,然后清空当前文件。但是这有一个问题就是拷贝和截断之间会有时间差,存在丢数据的可能。


2.给rsyslog发信号。重新打开log文件。

在/etc/logrotate.d/zw_log里添加

sharedscripts

postrotate

/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true

endscript

postrotate表示在日志轮转后执行

sharedscripts表示zw_notice.log、zw_info.log两个日志共享这个脚本,就是说他俩轮转完成后只执行一次这个脚本,默认情况下是每个脚本轮转完成就执行一次


新的logrotate配置文件:

1
2
3
4
5
6
7
8
9
10
11
/var/log/dnsmasq/dnsmasq .log {
         daily      // 按天轮转日志
         rotate 15  // 保留15个log文件
         compress   // 压缩轮转后的文件
         copytruncate
         delaycompress 
         dateext
         missingok
         notifempty
         create 0664 root root
}










本文转自 曾哥最爱 51CTO博客,原文链接:http://blog.51cto.com/zengestudy/1923824,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值