背景介紹
對于網際網路小公司而言,對于服務日志的處理一般都不咋樣,在微服務使用之後之後可能稍微好一些,但還是有很多傳統的服務,如: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 | 日志是空的就不輪替 |
将輪替後的檔案發送到指定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. 檢視輪替後效果:
可以看到原本 300M 左右的被壓縮到 64 M。
4. 加入定時任務:
crontab -e
# LOGROTATE
0 */2 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/tomcat >> /tmp/logrotate.log
這樣就能每隔兩小時輪替一次了!