背景
????????在編寫腳本或者運行項目的時候,一般都需要在適當的地方做日志輸出,方便在出問題或者有需要的時候可以快速定位代碼位置。
? ? ? ? 因此,只要系統正常運行,就會一直有日志不斷輸出,日志文件也會越來越大。長時間累計下來,一個日志文件可能有數百G大小,想打開文件查看都很難。如果對于大部分久遠的日志信息我們并不需要,那么這樣保存如此多的日志信息,對磁盤空間既是浪費,也是很大的額外負擔。
? ? ? ? 所以,很多時候我們需要日志記錄關鍵信息,但是只需要保留近期的日志信息,比如三十天內的日志。這樣能在保證我們可以在項目出現問題的時候能找到近期的相關信息,又不至于保存了太多的無用信息。
? ? ? ? 最近,我做的項目中就遇到了需要處理日志的問題。因為在以前沒有做日志的輪轉,導致日志可能累計了半年甚至更久的。不僅占了大量磁盤空間,查看日志也非常的麻煩。
????????一開始我試圖通過將所有輸出日志的格式統一,然后通過另外的腳本讀取所有的日志文件,再對日志文件進行切分。邏輯上這樣做確實沒有問題,但是實際操作的話,卻并沒有足夠的可行性。主要有兩個原因:
1.項目中有日志輸出的地方非常多,如果要統一日志的輸出格式的話,需要在所有輸出日志的地方都做代碼修改。這樣做不僅需要做的改動非常多,而且可能會有遺漏。
2.在使用另外的腳本讀取日志文件進行切分的時候,可能會在當時有腳本正在向文件寫日志,多方操作可能會有沖突。如果要加文件鎖,也會是非常麻煩的事情,要加很多異常處理情況。
? ? ? ? 為了解決上述問題,以及讓日志輪轉變得更加簡單方便,我們可以使用logrotate進行日志的自動輪轉與切分。
Logrotate
簡介
? ? ? ? 上圖所示為logrotate的介紹,logrotate就是專門用來自動切分日志文件的,可以對文件進行輪轉、壓縮、移除等。Linux系統默認是安裝了logrotate的。
配置
? ? ? ? logrotate的基礎配置文件為/etc/logrotate.conf,在/etc目錄下還有個文件夾/etc/logrotate.d,用戶可以將自己的配置文件放在這個文件夾中。這個文件夾中所有的文件都會被讀取,然后在運行logrotate的時候被執行。
? ? ? ? logrotate基于cron執行,默認每天執行一次。cron的配置文件為/etc/cron.daily/logrotate。如果不進行額外的配置,默認會在每天凌晨運行一次,不同系統可能在時間上略有差異。
? ? ? ? 如果確實需要一天多次運行logrotate,可以自行配置crontab任務。在配置任務之前,可以手動執行確保配置的正確性。在執行的時候,可以增加參數,顯示一些我們需要的信息:
-d, --debug :debug模式,測試配置文件是否有錯誤。
-f, --force :強制轉儲文件。
-m, --mail=command :壓縮日志后,發送日志到指定郵箱。
-s, --state=statefile :使用指定的狀態文件。
-v, --verbose :顯示轉儲過程
????????在正式運行前,可以先使用-d參數,查看輸出是否正常。然后可以使用-f強制執行。-vf會在強制執行的同時輸出操作過程的詳細信息。
使用
? ? ? ? 有新的日志輪轉的需求,可以直接向相關配置加載logrotate.conf中,但是這樣管理起來很不方便。建議是在logrotate.d文件夾中添加新的配置文件。
? ? ? ? 新的配置的格式一般如下所示:
? ? ? ? 文件開始是需要加入輪轉的日志的路徑,如圖中的/var/log/apt/term.log。然后是用{}包起來的執行參數,一行一個。上圖中的樣例的執行效果是:每個月進行一次輪轉;最多會存在12個文件;日志輪轉后自動壓縮;如果文件不存在,忽略報錯信息繼續執行后面的;當日志文件為空時,不進行輪轉。
????????具體執行的時候流程如下:
1.第一次執行完之后,原本的term.log會變成term.log.1,然后系統會新建一個term.log給之后的日志寫入。
2.第二次執行后,term.log.1變成term.log.2,term.log變成term.log.1,然后再生成一個新的term.log。
3.同以上操作,每次執行后,都會生成一個新的文件,然后所有文件后綴做一次輪轉。
4.當生成了第13個文件時,這個文件會被刪除,只保留12個文件。
其它參數說明
? ? ? ? 用戶可以根據自己的需求,選擇合適的配置參數。比如輪轉的周期(daily,weekly,monthly),是否壓縮,是否創建新文件等等。
? ? ? ? 對于需要自定義輪轉周期的,也可以自行配置cron任務。