某懶人寫個程式,要管理log,留作日後的後續功能處理和統計和上司需要。因為懶得寫,是以直接用了syslog函數,把log交給rsyslog去寫了。然後用logrotate每天做日志輪轉。
兩種log分别發送到了local6.info和local6.notice。
在/etc/rsyslog.conf裡添加了
local6.info /var/log/zw_info.log
local6.notice /var/log/zw_notice.log
在/etc/logrotate.d/建新檔案zw_log
<code>[root@localhost logrotate.d]# cat zw_log /var/log/zw_notice.log /var/log/zw_info.log { nocompress daily rotate 21 }</code>
意為他倆不壓縮、每天輪轉、保留21份。
但是運作卻發現每天雖然在生成新日志檔案,但是日志還是被寫到舊檔案裡去。好好研究了一下發現這錯誤犯的真2,rsyslog和logrotate根本就是兩個軟體包兩回事嘛。雖然logrotate重命名了目前log,删了舊log,但是rsyslog不知道哇,打開的檔案還是舊檔案嘛。當然寫的就是舊檔案了嘛。
經探索後發現這個問題有兩種解決辦法。
1.copytruncate,拷貝後截斷。
把目前log拷貝後截斷。可以了解為把内容拷貝走作為備份,然後清空目前檔案。但是這有一個問題就是拷貝和截斷之間會有時間差,存在丢資料的可能。
2.給rsyslog發信号。重新打開log檔案。
在/etc/logrotate.d/zw_log裡添加
<code>sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript</code>
postrotate表示在日志輪轉後執行
sharedscripts表示zw_notice.log、zw_info.log兩個日志共享這個腳本,就是說他倆輪轉完成後隻執行一次這個腳本,預設情況下是每個腳本輪轉完成就執行一次。
然後問題就解決啦,程式改動出奇的小,每天有新檔案生成,定期處理下超14天的内容。超21天的log會被自動删除。^o^ 成功向四個現代化邁近一小步。
本文轉自 Tenderrain 51CTO部落格,原文連結:http://blog.51cto.com/tenderrain/1704463