天天看點

logrotate切割日志後,新的日志還是寫入到老的日志檔案中

線上生産環境中,安裝了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&gt; /dev/null` 2&gt; /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,如需轉載請自行聯系原作者

繼續閱讀