日志管理目標
日志的管理,一般包括兩大部分
日志內容,合理的日志內容(日志錨點,內容格式,等)可以為應用服務的執行記錄、問題排查提供最有力的幫助
日志存檔規則,包括日志分割方式(按日期、按文件大小,等),日志存檔數量,如只保存最近一個月,等
對于自行開發的應用服務,日志的管理可以由開發人員通過日志組件定制化,如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...]-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配置文件維護
鏈接:https://www.cnblogs.com/xiaoyaozhe/p/17671275.html
-
Linux
+關注
關注
87文章
11304瀏覽量
209476 -
文件
+關注
關注
1文章
566瀏覽量
24744 -
MySQL
+關注
關注
1文章
809瀏覽量
26564 -
日志
+關注
關注
0文章
138瀏覽量
10642
原文標題:Linux日志管理經驗總結(crontab+logrotate)
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論