自動(dòng)日志輪轉(zhuǎn)(logrotate)

背景

????????在編寫腳本或者運(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ù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 了解日志文件是很重要的事情。日志文件可以記錄系統(tǒng)在什么時(shí)間、哪臺(tái)主機(jī)、哪個(gè)服務(wù)、出現(xiàn)了什么信息等??梢栽谙到y(tǒng)出現(xiàn)問(wèn)...
    Zhang21閱讀 5,524評(píng)論 0 5
  • 日志管理2 1、日志服務(wù)的配置文件 [loring ~]# vim /etc/rsyslog.conf ...
    崔千易閱讀 667評(píng)論 0 0
  • 日志管理Rsyslog [TOC] 背景 有一個(gè)4臺(tái)機(jī)器的分布式服務(wù),不多不少,上每臺(tái)機(jī)器上查看日志比較麻煩,用F...
    ferret閱讀 31,803評(píng)論 0 6
  • 每周回家,總是聽(tīng)到媽媽抱怨,指責(zé)這個(gè)不好,那個(gè)不好,心里煩,爸爸不愿意聽(tīng)她講,她就和我們講一件事可以講十遍,我實(shí)在...
    梁耀之閱讀 2,945評(píng)論 0 0
  • 她是最尊貴的公主,剔透玲瓏,深得父皇寵愛(ài)。 五歲誕辰,父皇問(wèn)她有何愿望,她說(shuō),“我要以父皇為榜樣,操縱皇權(quán),且試天...
    凡茜貓咪閱讀 777評(píng)論 0 2

友情鏈接更多精彩內(nèi)容