天天看點

Linux日志管理神器之Logrotate日志分割,以及crontab定時輪詢

作者:運維筆記ywbj

前言:

有些服務,會自動産生大量的日志檔案,如果不限制,會占用磁盤空間。

如果單純的用定時任務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           

繼續閱讀