背景
????????在編寫腳本或者運(yùn)行項(xiàng)目的時(shí)候,一般都需要在適當(dāng)?shù)牡胤阶鋈罩据敵?,方便在出?wèn)題或者有需要的時(shí)候可以快速定位代碼位置。
? ? ? ? 因此,只要系統(tǒng)正常運(yùn)行,就會(huì)一直有日志不斷輸出,日志文件也會(huì)越來(lái)越大。長(zhǎng)時(shí)間累計(jì)下來(lái),一個(gè)日志文件可能有數(shù)百G大小,想打開(kāi)文件查看都很難。如果對(duì)于大部分久遠(yuǎn)的日志信息我們并不需要,那么這樣保存如此多的日志信息,對(duì)磁盤空間既是浪費(fèi),也是很大的額外負(fù)擔(dān)。
? ? ? ? 所以,很多時(shí)候我們需要日志記錄關(guān)鍵信息,但是只需要保留近期的日志信息,比如三十天內(nèi)的日志。這樣能在保證我們可以在項(xiàng)目出現(xiàn)問(wèn)題的時(shí)候能找到近期的相關(guān)信息,又不至于保存了太多的無(wú)用信息。
? ? ? ? 最近,我做的項(xiàng)目中就遇到了需要處理日志的問(wèn)題。因?yàn)樵谝郧皼](méi)有做日志的輪轉(zhuǎn),導(dǎo)致日志可能累計(jì)了半年甚至更久的。不僅占了大量磁盤空間,查看日志也非常的麻煩。
????????一開(kāi)始我試圖通過(guò)將所有輸出日志的格式統(tǒng)一,然后通過(guò)另外的腳本讀取所有的日志文件,再對(duì)日志文件進(jìn)行切分。邏輯上這樣做確實(shí)沒(méi)有問(wèn)題,但是實(shí)際操作的話,卻并沒(méi)有足夠的可行性。主要有兩個(gè)原因:
1.項(xiàng)目中有日志輸出的地方非常多,如果要統(tǒng)一日志的輸出格式的話,需要在所有輸出日志的地方都做代碼修改。這樣做不僅需要做的改動(dòng)非常多,而且可能會(huì)有遺漏。
2.在使用另外的腳本讀取日志文件進(jìn)行切分的時(shí)候,可能會(huì)在當(dāng)時(shí)有腳本正在向文件寫日志,多方操作可能會(huì)有沖突。如果要加文件鎖,也會(huì)是非常麻煩的事情,要加很多異常處理情況。
? ? ? ? 為了解決上述問(wèn)題,以及讓日志輪轉(zhuǎn)變得更加簡(jiǎn)單方便,我們可以使用logrotate進(jìn)行日志的自動(dòng)輪轉(zhuǎn)與切分。
Logrotate
簡(jiǎn)介

? ? ? ? 上圖所示為logrotate的介紹,logrotate就是專門用來(lái)自動(dòng)切分日志文件的,可以對(duì)文件進(jìn)行輪轉(zhuǎn)、壓縮、移除等。Linux系統(tǒng)默認(rèn)是安裝了logrotate的。
配置
? ? ? ? logrotate的基礎(chǔ)配置文件為/etc/logrotate.conf,在/etc目錄下還有個(gè)文件夾/etc/logrotate.d,用戶可以將自己的配置文件放在這個(gè)文件夾中。這個(gè)文件夾中所有的文件都會(huì)被讀取,然后在運(yùn)行l(wèi)ogrotate的時(shí)候被執(zhí)行。
? ? ? ? logrotate基于cron執(zhí)行,默認(rèn)每天執(zhí)行一次。cron的配置文件為/etc/cron.daily/logrotate。如果不進(jìn)行額外的配置,默認(rèn)會(huì)在每天凌晨運(yùn)行一次,不同系統(tǒng)可能在時(shí)間上略有差異。
? ? ? ? 如果確實(shí)需要一天多次運(yùn)行l(wèi)ogrotate,可以自行配置crontab任務(wù)。在配置任務(wù)之前,可以手動(dòng)執(zhí)行確保配置的正確性。在執(zhí)行的時(shí)候,可以增加參數(shù),顯示一些我們需要的信息:
-d, --debug :debug模式,測(cè)試配置文件是否有錯(cuò)誤。
-f, --force :強(qiáng)制轉(zhuǎn)儲(chǔ)文件。
-m, --mail=command :壓縮日志后,發(fā)送日志到指定郵箱。
-s, --state=statefile :使用指定的狀態(tài)文件。
-v, --verbose :顯示轉(zhuǎn)儲(chǔ)過(guò)程
????????在正式運(yùn)行前,可以先使用-d參數(shù),查看輸出是否正常。然后可以使用-f強(qiáng)制執(zhí)行。-vf會(huì)在強(qiáng)制執(zhí)行的同時(shí)輸出操作過(guò)程的詳細(xì)信息。
使用
? ? ? ? 有新的日志輪轉(zhuǎn)的需求,可以直接向相關(guān)配置加載logrotate.conf中,但是這樣管理起來(lái)很不方便。建議是在logrotate.d文件夾中添加新的配置文件。
? ? ? ? 新的配置的格式一般如下所示:

? ? ? ? 文件開(kāi)始是需要加入輪轉(zhuǎn)的日志的路徑,如圖中的/var/log/apt/term.log。然后是用{}包起來(lái)的執(zhí)行參數(shù),一行一個(gè)。上圖中的樣例的執(zhí)行效果是:每個(gè)月進(jìn)行一次輪轉(zhuǎn);最多會(huì)存在12個(gè)文件;日志輪轉(zhuǎn)后自動(dòng)壓縮;如果文件不存在,忽略報(bào)錯(cuò)信息繼續(xù)執(zhí)行后面的;當(dāng)日志文件為空時(shí),不進(jìn)行輪轉(zhuǎn)。
????????具體執(zhí)行的時(shí)候流程如下:
1.第一次執(zhí)行完之后,原本的term.log會(huì)變成term.log.1,然后系統(tǒng)會(huì)新建一個(gè)term.log給之后的日志寫入。
2.第二次執(zhí)行后,term.log.1變成term.log.2,term.log變成term.log.1,然后再生成一個(gè)新的term.log。
3.同以上操作,每次執(zhí)行后,都會(huì)生成一個(gè)新的文件,然后所有文件后綴做一次輪轉(zhuǎn)。
4.當(dāng)生成了第13個(gè)文件時(shí),這個(gè)文件會(huì)被刪除,只保留12個(gè)文件。
其它參數(shù)說(shuō)明

? ? ? ? 用戶可以根據(jù)自己的需求,選擇合適的配置參數(shù)。比如輪轉(zhuǎn)的周期(daily,weekly,monthly),是否壓縮,是否創(chuàng)建新文件等等。
? ? ? ? 對(duì)于需要自定義輪轉(zhuǎn)周期的,也可以自行配置cron任務(wù)。