當前位置: 妍妍網 > 碼農

Linux 日誌管理經驗總結( crontab + logrotate )

2024-06-19碼農

連結:https://www.cnblogs.com/xiaoyaozhe/p/17671275.html

日誌管理目標

日誌的管理,一般包括兩大部份

  1. 日誌內容,合理的日誌內容(日誌錨點,內容格式,等)可以為套用服務的執行記錄、問題排查提供最有力的幫助

  2. 日誌存檔規則,包括日誌分割方式(按日期、按檔大小,等),日誌存檔數量,如只保存最近一個月,等

對於自行開發的套用服務,日誌的管理可以由開發人員透過日誌元件客製化,如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,執行過程中,對日誌儲存檔將使用檔控制代碼跟蹤,如此會有以下問題:

    1. 將日誌檔重新命名,同時新建一個同名的檔,元件依然會向原來的檔中輸出日誌

    2. 將日誌檔刪除(rm -f),也需要同時將套用服務元件行程重新開機才行,否則刪除的檔也會由於被占用而無法釋放磁盤資源

    3. 刪除但被占用的檔將無法透過 ls -l 命令檢視,也無法透過 du -sh 命令統計磁盤占用,但 df -h 命令會顯示真實磁盤占用,只能透過 lsof 命令,檢視開啟的檔描述符,對運維造成很大麻煩

    針對這種情況

    1. 如果只是單次清理檔,可以使用清空檔的方式,如 echo > log.log,或其他清空的方式,但切記不能直接 rm -f 刪除

    2. 如果已經執行 rm -f 刪除,則可以使用 lsof | grep -i deleted 命令檢視被刪除但無法回收的檔,然後將相應的行程重新開機即可回收

    3. 如果要保留日誌內容,又要控制儲存容量,則需要使用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{dailymissingokrotate 7compressdelaycompressnotifemptycreate 644 root rootsharedscriptspostrotate[ ! -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 nobodynocreate 不建立新的日誌檔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 100ksize = 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}

    附錄:關於常用元件執行時日誌管理

    1. nginx不支持自動清理,預設單檔持續寫入,且不會自動捲動

    2. mysql不支持自動清理,預設單檔持續寫入,且不會自動捲動

    3. zookeeper預設支持自動清理(限制檔大小和個數),log4j配置檔維護

    4. redis不支持自動清理,只記錄少量核心日誌,單檔持續寫入,但預設只記錄少量核心日誌,可以不處理

    5. kafka的數據記錄日誌(topic、offset等),支持自動清理,配置檔維護

    6. kafka操作日誌,預設在安裝目錄logs目錄,支持自動捲動,但不會自動清理,log4j配置檔維護

    <END>

    點這裏👇關註我,記得標星呀~