背景介紹
對於互聯網小公司而言,對於服務日志的處理一般都不咋樣,在微服務使用之后之后可能稍微好一些,但還是有很多傳統的服務,如: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
這樣就能每隔兩小時輪替一次了!