線上生産環境中,安裝了dnsmasq,并記錄日志。由于每一次dns查詢都會生産日志,考慮到日志量越來越大,就用logrotate做日志輪轉。配置如下:
1
2
3
4
5
6
7
8
9
10
<code>/var/log/dnsmasq/dnsmasq</code><code>.log {</code>
<code> </code><code>daily </code><code>//</code><code>按天輪轉日志</code>
<code> </code><code>rotate 15 </code><code>//</code><code>保留15個log檔案</code>
<code> </code><code>compress </code><code>//</code><code>壓縮輪轉後的檔案</code>
<code> </code><code>delaycompress </code>
<code> </code><code>dateext</code>
<code> </code><code>missingok</code>
<code> </code><code>notifempty</code>
<code> </code><code>create 0664 root root</code>
<code>}</code>
配置後,用logrotate -f /etc/logrotate.d/dnsmasq 測試成功
<code>[root@SRV-OPS10-DNS01 logrotate.d]</code><code># ls -l /var/log/dnsmasq/ </code>
<code>total 8</code>
<code>-rw-r----- 1 root root 1 May 9 17:55 dnsmasq.log</code>
<code>-rw-r----- 1 root root 1092 May 9 17:45 dnsmasq.log-20170509</code>
但是新問題是,雖然日志被切斷了,但是新的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配置檔案:
11
<code> </code><code>copytruncate</code>
<code></code>
本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1923824,如需轉載請自行聯系原作者