前言:
有些服務,會自動産生大量的日志檔案,如果不限制,會占用磁盤空間。
如果單純的用定時任務crontab删除,又不太靈活,這時需要日志神器logrotate。
logrotate工具是系統自帶為了友善進行日志管理而産生的一個工具。
系統會定時運作 logrotate,一般是每天一次。也是基于定時任務crontab運作的。
配置檔案:
主配置檔案的位置在 /etc/logrotate.conf,一般配置在 /etc/logrotate.d/子目錄下。
如系統預設日志配置:
$ vim /etc/logrotate.d/log_file
/var/log/log_file {
monthly
rotate 5
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}
配置檔案參數:
- daily :指定轉儲周期為每天
- weekly :指定轉儲周期為每周
- monthly :指定轉儲周期為每月
- rotate count :指定日志檔案删除之前轉儲的次數,0 指沒有備份,5 指保留 5 個備份
- tabooext [+] list:讓 logrotate 不轉儲指定擴充名的檔案,預設的擴充名是:.rpm-orig, .rpmsave, v, 和~
- missingok:在日志輪循期間,任何錯誤将被忽略,例如 “檔案無法找到” 之類的錯誤。
- size size:當日志檔案到達指定的大小時才轉儲,bytes (預設) 及 KB (sizek) 或 MB (sizem)
- compress: 通過 gzip 壓縮轉儲以後的日志
- nocompress: 不壓縮
- copytruncate:用于還在打開中的日志檔案,把目前日志備份并截斷
- nocopytruncate: 備份日志檔案但是不截斷
- create mode owner group : 轉儲檔案,使用指定的檔案模式建立新的日志檔案
- nocreate: 不建立新的日志檔案
- delaycompress: 和 compress 一起使用時,轉儲的日志檔案到下一次轉儲時才壓縮
- nodelaycompress: 覆寫 delaycompress 選項,轉儲同時壓縮。
- errors address : 轉儲時的錯誤資訊發送到指定的 Email 位址
- ifempty :即使是空檔案也轉儲,這個是 logrotate 的預設選項。
- notifempty :如果是空檔案的話,不轉儲
- mail address : 把轉儲的日志檔案發送到指定的 E-mail 位址
- nomail : 轉儲時不發送日志檔案
- olddir directory:轉儲後的日志檔案放入指定的目錄,必須和目前日志檔案在同一個檔案系統
- noolddir: 轉儲後的日志檔案和目前的日志檔案放在同一個目錄下
- prerotate/endscript: 在轉儲以前需要執行的指令可以放入這個對,這兩個關鍵字必須單獨成行
更多資訊請參考man logrotate幫助文檔
模闆是通用的,而配置參數則根據你的需求進行調整,不是所有的參數都是必要的。
/var/log/log_file {
size=50M
rotate 5
dateext
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}
在上面的配置檔案中,我們隻想要輪詢一個日志檔案,size=50M 指定日志檔案大小可以增長到 50MB,dateext 指 示讓舊日志檔案以建立日期命名。
可自行參考/etc/logrotate.d/目錄下系統預設的檔案。
logrotate指令:
具體 logrotate 指令格式如下:
logrotate [OPTION...] <configfile>
-d, --debug :debug 模式,測試配置檔案是否有錯誤。
-f, --force :強制轉儲檔案。
-m, --mail=command :壓縮日志後,發送日志到指定郵箱。
-s, --state=statefile :使用指定的狀态檔案。
-v, --verbose :顯示轉儲過程。
要為某個特定的配置調用 logrotate:
logrotate /etc/logrotate.d/log_file
排障過程中的最佳選擇是使用-d選項以預演方式運作 logrotate。要進行驗證,不用實際輪循任何日志檔案, 可以模拟演練日志輪循并顯示其輸出。
[root@localhost ~]$ logrotate -d /etc/logrotate.d/log_file
WARNING: logrotate in debug mode does nothing except printing debug messages! Consider using verbose mode (-v) instead if this is not what you want.
reading config file /etc/logrotate.d/dnmplog
Reading state from file: /var/lib/logrotate/status
Allocating hash table for state file, size 64 entries
Creating new state
Creating new state
Creating new state
Creating new state
Handling 1 logs
rotating pattern: /home/www/localhost/storage/logs 104857600 bytes (6 rotations)
empty log files are not rotated, old logs are removed
No logs found. Rotation not needed.
正如我們從上面的輸出結果可以看到的,logrotate 判斷該輪循是不必要的。如果檔案的時間小于一天,就會發生了。
強制輪循即使輪循條件沒有滿足,我們也可以通過使用-f選項來強制 logrotate 輪循日志檔案,-v參數提供了詳細的輸出。
logrotate -vf /etc/logrotate.d/log_file
個人項目配置:
項目每天可産生20G左右的日志,顯示不能做每日輪詢,是以額外需要添加定時任務做每小時,或者每隔多少分鐘。
/home/www/localhost/storage/logs/log_*.log {
su root root
size 100M
rotate 5
compress
delaycompress
missingok
notifempty
nocreate
}
如果輪詢日志異常報錯如下:
error: skipping “” because parent directory has insecure permissions (It’s world writable or writable by group which is not “root”) Set “su” directive in config file to tell logrotate which user/group should be used for rotation.”
需要加 su root root 選項。
同時添加定時任務:
crontab -e
*/40 * * * * sudo usr/sbin/logrotate -f /etc/logrotate.d/dnmplog
0 4 * * * sudo find /home/dnmp/www/localhost/storage/logs -mtime +1 -name "log_*.log*" -exec rm -fr {} \;
定時任務說明:
第一條,每隔40分鐘輪詢執行一次logrotate任務。
第二條,每天淩晨4點删除前一天的日志,原因如下:
由于項目系統産生日志格式的原因,會導緻以下情況:
如果昨天的分割到4個後(或者1,2,3),時間到第二天後,沒法轉儲遞增,會一直停留在4,沒法删除,每天會有,久而久之,也會占用磁盤空間。是以需要定時删除。
log_20211104.log.1
log_20211104.log.2
log_20211104.log.3
log_20211104.log.4
log_20211105.log.1
log_20211105.log.2
log_20211105.log.3
log_20211105.log.4
log_20211105.log.5
設定完成
開啟定時任務日志,以便檢視定時任務是否執行。後續可取消。
sudo vim /etc/rsyslog.d/50-default.conf
cron.* /var/log/cron.log #将cron前面的注釋符去掉
重新開機rsyslog
sudo systemctl restart rsyslog
#檢視定時任務執行日志
cat /var/log/cron.log