連結:https://www.cnblogs.com/xiaoyaozhe/p/17671275.html
日誌管理目標
日誌的管理,一般包括兩大部份
日誌內容,合理的日誌內容(日誌錨點,內容格式,等)可以為套用服務的執行記錄、問題排查提供最有力的幫助
日誌存檔規則,包括日誌分割方式(按日期、按檔大小,等),日誌存檔數量,如只保存最近一個月,等
對於自行開發的套用服務,日誌的管理可以由開發人員透過日誌元件客製化,如logback,log4j等,但對於安裝部署的第三方元件如MySQL、nginx、redis等,以及開發參照的第三方元件如nacos,sentinel等,除非元件開放了豐富的日誌配置參數,否則將無法按照開發人員的要求管理日誌檔。
特殊日誌場景
一些特殊套用服務或元件,如果沒有進行特定的配置操作,預設情況下將使日誌檔不受控制,為後期清理造成麻煩,常見的有
nohup方式啟動套用服務,如果未配置日誌重新導向,或者重新導向到了單檔,則系統將日誌持續輸出在nohup.out檔或重新導向的單檔
mysql資料庫支持配置日誌檔路徑,但無法自動清理日誌內容
nginx支持配置日誌內容樣版以及日誌檔路徑(預設access.log、error.log),但無法自動清理日誌內容
以上類似情況下,日誌將始終在單檔中持續輸出,過了一定時間後,日誌檔將占用無限大的磁盤儲存,對整個系統造成執行故障。
特殊工具 - 定時清理
可以使用Linux內建定時工具 crontab + 清理日誌指令碼的方式,實作定時清理,範例如下
crontab -e
# 定時清理日誌,保留最近7天
1 0 * * * find /logs.dir/ -mtime +7 | xargs rm -rf
特別關註
Linux系統下,有些套用服務元件如nginx與MySQL,執行過程中,對日誌儲存檔將使用檔控制代碼跟蹤,如此會有以下問題:
將日誌檔重新命名,同時新建一個同名的檔,元件依然會向原來的檔中輸出日誌
將日誌檔刪除(rm -f),也需要同時將套用服務元件行程重新開機才行,否則刪除的檔也會由於被占用而無法釋放磁盤資源
刪除但被占用的檔將無法透過 ls -l 命令檢視,也無法透過 du -sh 命令統計磁盤占用,但 df -h 命令會顯示真實磁盤占用,只能透過 lsof 命令,檢視開啟的檔描述符,對運維造成很大麻煩
針對這種情況
如果只是單次清理檔,可以使用清空檔的方式,如 echo > log.log,或其他清空的方式,但切記不能直接 rm -f 刪除
如果已經執行 rm -f 刪除,則可以使用 lsof | grep -i deleted 命令檢視被刪除但無法回收的檔,然後將相應的行程重新開機即可回收
如果要保留日誌內容,又要控制儲存容量,則需要使用logrotate的 拷貝+清空 方式,即只是將日誌檔內容拷貝一份存檔,然後清空當前日誌檔(而非刪除)
特殊工具 - logrotate
對於不方便進行自訂日誌管理的套用服務元件,可以自訂指令碼維護,可以自行開發套用軟體維護,但強聯推薦使用Linux系統整合的日誌管理工具logrotate,該工具由Linux系統crontab定時排程,支持為相關日誌檔(或其他檔)自訂儲存規則,但日誌內容只能按照套用服務元件的實作輸出。
logrotate提供的功能參數很多,比較常用的如下
日誌分割周期
日誌副檔名
日誌檔分割方式,包括新建+刪除,拷貝+清空,等,適用不同套用服務場景
日誌內容壓縮
日誌檔存檔數量
logrotate 命令格式:
logrotate [OPTION...] <configfile>
-d, --debug :debug模式,測試配置檔是否有錯誤。
-f, --force :強制轉儲檔。
-m, --mail=command :壓縮日誌後,發送日誌到指定信箱。
-s, --state=statefile :使用指定的狀態檔。
-v, --verbose :顯示轉儲過程。
vi /etc/logrotate.d/nginx #在/etc/logrotate.d/目錄下新建nginx檔,內容如下:
/usr/share/nginx/log/*.log{
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
sharedscripts
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
#呼叫方法
logrotate -d /etc/logrotate.d/nginx
#結合crontab定時執行
echo "0 0 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/nginx > /dev/null 2>&1" >> /var/spool/cron/root
#參數說明:
compress 透過gzip 壓縮轉儲以後的日誌
nocompress 不做gzip壓縮處理
copytruncate 用於還在開啟中的日誌檔,把當前日誌備份並截斷;是先拷貝再清空的方式,拷貝和清空之間有一個時間差,可能會遺失部份日誌數據。
nocopytruncate 備份日誌檔不過不截斷
create mode owner group 輪轉時指定建立新檔的內容,如create 0777 nobody nobody
nocreate 不建立新的日誌檔
delaycompress 和compress 一起使用時,轉儲的日誌檔到下一次轉儲時才壓縮
nodelaycompress 覆蓋 delaycompress 選項,轉儲同時壓縮。
missingok 如果日誌遺失,不報錯繼續捲動下一個日誌
errors address 專儲時的錯誤資訊發送到指定的Email 地址
ifempty 即使日誌檔為空檔也做輪轉,這個是logrotate的缺省選項。
notifempty 當日誌檔為空時,不進行輪轉
mail address 把轉儲的日誌檔發送到指定的E-mail 地址
nomail 轉儲時不發送日誌檔
olddir directory 轉儲後的日誌檔放入指定的目錄,必須和當前日誌檔在同一個檔案系統
noolddir 轉儲後的日誌檔和當前日誌檔放在同一個目錄下
sharedscripts 執行postrotate指令碼,作用是在所有日誌都輪轉後統一執行一次指令碼。如果沒有配置這個,那麽每個日誌輪轉後都會執行一次指令碼
prerotate 在logrotate轉儲之前需要執行的指令,例如修改檔的內容等動作;必須獨立成行
postrotate 在logrotate轉儲之後需要執行的指令,例如重新啟動 (kill -HUP) 某個服務!必須獨立成行
daily 指定轉儲周期為每天
weekly 指定轉儲周期為每周
monthly 指定轉儲周期為每月
rotate count 指定日誌檔刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份
dateext 使用當期日期作為命名格式
dateformat .%s 配合dateext使用,緊跟在下一行出現,定義檔切割後的檔名,必須配合dateext使用,只支持 %Y %m %d %s 這四個參數
size(或minsize) log-size 當日誌檔到達指定的大小時才轉儲,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
#當日誌檔 >= log-size 的時候就轉儲。以下為合法格式:(其他格式的單位大小寫沒有試過)
size = 5 或 size 5 (>= 5 個字節就轉儲)
size = 100k 或 size 100k
size = 100M 或 size 100M
附錄:logrotate簡易配置
MySQL
/data/mysql/log/mysqld.log
{
daily
dateext
dateyesterday
copytruncate
notifempty
missingok
olddir backup
rotate 60
compress
}
nginx
/usr/local/nginx/logs/access.log
/usr/local/nginx/logs/error.log
{
daily
dateext
dateyesterday
copytruncate
notifempty
missingok
olddir backup
rotate 30
compress
}
附錄:關於常用元件執行時日誌管理
nginx不支持自動清理,預設單檔持續寫入,且不會自動捲動
mysql不支持自動清理,預設單檔持續寫入,且不會自動捲動
zookeeper預設支持自動清理(限制檔大小和個數),log4j配置檔維護
redis不支持自動清理,只記錄少量核心日誌,單檔持續寫入,但預設只記錄少量核心日誌,可以不處理
kafka的數據記錄日誌(topic、offset等),支持自動清理,配置檔維護
kafka操作日誌,預設在安裝目錄logs目錄,支持自動捲動,但不會自動清理,log4j配置檔維護
<END>
點這裏👇關註我,記得標星呀~