天天看點

簡單好用的日志管理工具 Logrotate

前言

日志就像程式的生命記錄儀,詳細記錄下了程式運作的點點滴滴。

慎重的選擇記錄哪些日志:在茫茫日志海中尋找真正記錄問題的日志,你是不想經曆的;

精心的定時壓縮轉移日志:故障發生了,日志卻丢了,此時的任何辯解都是蒼白無力的。

記錄哪些日志需要你在編寫應用程式慎重決定,本文講述如何使用Linux自帶的logrotate程式來精心組織我們可愛的日志檔案。

簡介

日志,實際就是本文檔案,且是個内容不斷在增長的檔案。處理通常就是按天或者按大小來備份、壓縮或轉儲,非常簡單。

<code>/var/log/messages</code>是大家熟悉的系統日志存放位置。如果該檔案内容增長特别快,幾天可能就撐滿了整個硬碟,那麼對該檔案的備份、壓縮或轉儲就顯得尤為重要。

手動怎麼處理呢?可能是:

編寫日志處理腳本,腳本檢測如果日志檔案大小超過10M就拷貝一份日志并壓縮轉儲,中間還需要清空原日志;

Crontab中把這個腳本作為定時任務,每天執行下。

Logrotate實際就是起着上述腳本作用的小工具,他通過讓使用者來配置規則的方式,檢測和處理日志檔案。配合Cron可讓處理定時化;

Logrotate預制了大量判斷條件和處理方式,可大大降低手寫腳本的負擔和出錯的可能;

Logrorate檢測日志檔案屬性,比對使用者配置好的檢測條件,對滿足條件的再根據使用者配置的要求來處理,整個可以通過Cron來定時排程,這其實是非常經典的Linux解決問題的思路,可以好好靜下心來品味下,簡單,好用。

組成

以下是logrotate運作的關鍵點:

<code>/usr/bin/logrotate</code> 程式所在位置;

<code>/etc/cron.daily/logrotate</code> 預設讓Cron每天執行logrotate一次;

<code>/etc/logrotate.conf</code> 全局配置檔案;

<code>/etc/logrotate.d</code> 應用自個的配置檔案存放目錄,覆寫全局配置;

檢視全局配置檔案<code>cat /etc/logrotate.conf</code>,可以發現<code>#</code>是行注釋,配置項都是以關鍵字形式出現(那麼想知道每個關鍵字的作用,最簡單的就是直接man檢視了)。

仔細看下每個關鍵字的注釋,不難發現,比如:

weekly:表示每周處理下日志;

rotate4:最多保持4個輪轉備份,關于輪轉本身後文會詳述,很有意思;

create:處理完該日志檔案後,新生成一個日志檔案,當然盡可能是同名同權限等;

dateext:預設未加時間戳;

compress:預設不壓縮;

對wtmp和btmp日志做了單獨處理,于是你意識到了單獨的配置可以放在<code>/etc/logrotate.d</code>目錄,或者直接放在全局配置裡面。

于是當<code>logrotate</code>程式被執行時,按照字面意思<code>logrotate</code>預設是想每周處理下日志,對日志最多輪轉保留4份,處理方式是不壓縮也不加時間戳,處理完後再生成個同名檔案。當然這些是預設設定,還對wtmp和btmp日志處理做了單獨要求并且<code>include /etc/logrotate.d</code>目錄下還有一大堆處理要求。該目錄下配置檔案,在<code>logrotate</code>被執行後,都會不一個個讀取來執行。

例如檢視下<code>sssd</code>配置檔案的内容:

可以發現基本格式與全局配置檔案<code>/etc/logrotate.conf</code>一緻,不難想象單獨為某個日志配置的要求優先級肯定更高,如果與全局配置中出現相同項目的配置,單獨的肯定覆寫全局的。

配置檔案都指定完畢,logrotate可單獨執行了,當然也可以通過cron來定時執行;

預設的logrotate已經放在<code>/etc/cron.daily/logrotate</code>目錄,很明顯是讓cron每天執行一次logrotate程式;

當然你也可以将該腳本放到其他時間,比如每分鐘執行,甚至可以單獨寫crontab表達式來讓logrotate指定配置檔案和指定時間執行;

至此,我們看過了logrotate的全局配置檔案,單獨配置檔案,已經如何配合cront來定時執行。

為了加深記憶,我們先小結下:

logrotate是個程式,專門用來處理日志檔案;

處理需要使用者配置規則,比如指定超出10M則做什麼動作;

規則可配置到獨立的配置檔案中,當然全局還有個全局預設配置檔案,要知道每個配置檔案都放在哪哦;

logrotate一被執行,就會搜尋所有的配置檔案按要求處理日志;

可以配合cron讓logrotate定時執行;

測試

man過logrotate的同學大概知道logrotate該怎麼用了,常見的選項使用如下:

本例通過自定義配置檔案來壓縮指定日志檔案來測試logrotate的使用。

注意logrotate都是需要使用root來執行的,(但是可以通過配置項來指定生成的日志檔案為普通使用者的)。

測試正常;

以上<code>logrotate -f /etc/logrotate.d/test.conf</code>指令完全可以寫入crontab中,按照要求時間來執行,此處暫時不拆開講了。

我們從上述debug資訊中,摘錄輪轉部分的日志來了解下,什麼叫輪轉。

根據配置檔案要求,輪轉4份;

以僞代碼在簡寫上述日志為:

這就很容易了解了,所謂輪轉,就是類似二級制向右位移一樣不斷的重命名;

例子

在弄清楚logrotate的運作機制,又實地測試一番後,以下将通過多個例子方式來讓大家快速配置。

copytruncate的作用在于先複制一份目前日志檔案用做處理,再清空源日志檔案,讓其繼續接收日志。

當然在複制和清空的空隙可能會有若幹

摘自參考3;

postrotate和endscript中間可以編寫自定義腳本,用來對日志或者其他其定義處理,擴充性非常強;

例如由于logrotate對壓縮日志可指定的時間戳隻能到天,于是可以再自定義腳本裡面對檔案做時分等細化命名;

預設壓縮程式使用<code>.gz</code>,當然可以自定義,需要制定壓縮程式和字尾名;

參考

man logrotate

被遺忘的logrotate

HowTo: The Ultimate Logrotate Command Tutorial with 10 Examples

logrotate 進行nginx日志分割

繼續閱讀