天天看點

Logrotate 對伺服器日志按照小時切割并壓縮

背景介紹

對于網際網路小公司而言,對于服務日志的處理一般都不咋樣,在微服務使用之後之後可能稍微好一些,但還是有很多傳統的服務,如:Tomcat,Nginx 等在日志處理的時候仍然不是很友好。主要是很多時候開發需要檢視線上服務的日志便于查找 BUG,是以我們很多時候不是在查日志就是查日志的路上。

為了便于開發自己去檢視日志于是便使用 Nginx 做了個日志下載下傳站點。但是問題再次來了,那就是日志量太大,不好下載下傳。怎麼辦?壓縮呗。畢竟純文字壓縮比率超級高,100M 的檔案能夠壓縮到幾 M 不香嗎?

但是即使壓縮之後,解壓後仍然很多,我們可能隻需要檢視的是幾點到幾點的,其它的對于我們沒有意義。要是能夠按照小時再切割一下就好了。

于是想到了 Linux 的 logrotate。但是預設的規則好像并不能滿足我們的需求,因為它最低的時間也是按天計算的。

這時候就需要另外一個東西了,crontab 定時任務。

關于 logrotate

一般在伺服器初始化的時候這些工具都已經存在的,但是為了保險,還是手動安裝一下:

yum -y install logrotate      

服務簡單的說明:

服務的主配置檔案:/etc/logrotate.conf 

在主配置中可以看到 include /etc/logrotate.d 說明我們可以将使用者定義的配置直接放到這下面,系統會自動為我們執行。當然,系統的并不能很好的滿足我們需求。

再看看配置模闆:

日志檔案絕對路徑 {
    各種參數...
}      

參數包含:

參數 說明
compress 日志輪替時候對舊日志就行 gzip 壓縮
nocompress 不壓縮
daily 按天輪替
dateext 使用目前日期命名舊日志
dateformat .%s 對日期進行格式定制
ifempty 日志沒有内容的時候也進行輪替
notifempty 日志是空的就不輪替
mail 将輪替後的檔案發送到指定E-mail位址
nomail 不發郵件
copytruncate 輪替時候先拷貝日志,備份拷貝檔案,在清空本來的檔案,這樣不會導緻輪替後原檔案消失,缺點就是可能丢失小部分日志
monthly 一個月輪替一次
olddir 輪替後日志檔案放入指定的目錄
rotate 輪替最多保留之前的資料幾次
size 當日志增長到指定大小的時候開始輪替
weekly 按周輪替
yearly 按年輪替
Missingok 如果日志丢失,不報錯繼續滾動下一個日志

切割 Tomcat 日志示例 

說明:

1. 伺服器上面有這樣一個 tomcat 日志:/data/TEST-01-BACKEND/MALL/MALL-WEB-Serice-8000/logs/catalina.out

2. 我們想将這個檔案按每兩小時切割一次并壓縮,保留 100 個舊的切割,切割的檔案儲存到:/data/TEST-01-BACKEND/MALL/MALL-WEB-Serice-8000/logs/archives 目錄下。

開始配置:

1. 添加 logrotate 配置檔案:

vi /etc/logrotate.d/tomcat      

内容如下:

# MALL LOGROTATE
/data/TEST-01-BACKEND/MALL/MALL-WEB-Serice-8000/logs/catalina.out {
    notifempty 
    copytruncate
    rotate 100
    missingok
    compress
    dateext
    dateformat .%Y%m%d-%H
    olddir /data/TEST-01-BACKEND/MALL/MALL-WEB-Serice-8000/logs/archives
}      

紅色部分需要注意,第一個是為了輪替之後原檔案還存在,第二個為壓縮,第三個定義切割後檔案的名稱。

2. 手動執行一次輪替:

/usr/sbin/logrotate -vf /etc/logrotate.d/tomcat      

這裡如果報錯:because parent directory has insecure permissions (It's world writable or writable by group which is not "root") 

隻需要在配置中參數加入:

su root root      

3. 檢視輪替後效果:

Logrotate 對伺服器日志按照小時切割并壓縮

可以看到原本 300M 左右的被壓縮到 64 M。

4. 加入定時任務:

crontab -e      
# LOGROTATE
0 */2 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/tomcat >> /tmp/logrotate.log      

這樣就能每隔兩小時輪替一次了! 

繼續閱讀