日志管理目標
日志的管理,一般包括兩大部分
- 日志內容,合理的日志內容(日志錨點,內容格式,等)可以為應用服務的執行記錄、問題排查提供最有力的幫助
- 日志存檔規則,包括日志分割方式(按日期、按文件大小,等),日志存檔數量,如只保存最近一個月,等
對于自行開發的應用服務,日志的管理可以由開發人員通過日志組件定制化,如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簡易配置
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配置文件維護
浙公網安備 33010602011771號