日志管理目標(biāo)
日志的管理,一般包括兩大部分
日志內(nèi)容,合理的日志內(nèi)容(日志錨點(diǎn),內(nèi)容格式,等)可以為應(yīng)用服務(wù)的執(zhí)行記錄、問題排查提供最有力的幫助
日志存檔規(guī)則,包括日志分割方式(按日期、按文件大小,等),日志存檔數(shù)量,如只保存最近一個(gè)月,等
對(duì)于自行開發(fā)的應(yīng)用服務(wù),日志的管理可以由開發(fā)人員通過日志組件定制化,如logback,log4j等,但對(duì)于安裝部署的第三方組件如MySQL、nginx、redis等,以及開發(fā)引用的第三方組件如nacos,sentinel等,除非組件開放了豐富的日志配置參數(shù),否則將無法按照開發(fā)人員的要求管理日志文件。
特殊日志場景
一些特殊應(yīng)用服務(wù)或組件,如果沒有進(jìn)行特定的配置操作,默認(rèn)情況下將使日志文件不受控制,為后期清理造成麻煩,常見的有
nohup方式啟動(dòng)應(yīng)用服務(wù),如果未配置日志重定向,或者重定向到了單文件,則系統(tǒng)將日志持續(xù)輸出在nohup.out文件或重定向的單文件
mysql數(shù)據(jù)庫支持配置日志文件路徑,但無法自動(dòng)清理日志內(nèi)容
nginx支持配置日志內(nèi)容模板以及日志文件路徑(默認(rèn)access.log、error.log),但無法自動(dòng)清理日志內(nèi)容
以上類似情況下,日志將始終在單文件中持續(xù)輸出,過了一定時(shí)間后,日志文件將占用無限大的磁盤存儲(chǔ),對(duì)整個(gè)系統(tǒng)造成運(yùn)行故障。
特殊工具 - 定時(shí)清理
可以使用Linux自帶定時(shí)工具 crontab + 清理日志腳本的方式,實(shí)現(xiàn)定時(shí)清理,示例如下
crontab -e # 定時(shí)清理日志,保留最近7天 1 0 * * * find /logs.dir/ -mtime +7 | xargs rm -rf
特別關(guān)注
Linux系統(tǒng)下,有些應(yīng)用服務(wù)組件如nginx與MySQL,運(yùn)行過程中,對(duì)日志存儲(chǔ)文件將使用文件句柄跟蹤,如此會(huì)有以下問題:
將日志文件重命名,同時(shí)新建一個(gè)同名的文件,組件依然會(huì)向原來的文件中輸出日志
將日志文件刪除(rm -f),也需要同時(shí)將應(yīng)用服務(wù)組件進(jìn)程重啟才行,否則刪除的文件也會(huì)由于被占用而無法釋放磁盤資源
刪除但被占用的文件將無法通過 ls -l 命令查看,也無法通過 du -sh 命令統(tǒng)計(jì)磁盤占用,但 df -h 命令會(huì)顯示真實(shí)磁盤占用,只能通過 lsof 命令,查看打開的文件描述符,對(duì)運(yùn)維造成很大麻煩
針對(duì)這種情況
如果只是單次清理文件,可以使用清空文件的方式,如 echo > log.log,或其他清空的方式,但切記不能直接 rm -f 刪除
如果已經(jīng)執(zhí)行 rm -f 刪除,則可以使用 lsof | grep -i deleted 命令查看被刪除但無法回收的文件,然后將相應(yīng)的進(jìn)程重啟即可回收
如果要保留日志內(nèi)容,又要控制存儲(chǔ)容量,則需要使用logrotate的 拷貝+清空 方式,即只是將日志文件內(nèi)容拷貝一份存檔,然后清空當(dāng)前日志文件(而非刪除)
特殊工具 - logrotate
對(duì)于不方便進(jìn)行自定義日志管理的應(yīng)用服務(wù)組件,可以自定義腳本維護(hù),可以自行開發(fā)應(yīng)用軟件維護(hù),但強(qiáng)聯(lián)推薦使用Linux系統(tǒng)集成的日志管理工具logrotate,該工具由Linux系統(tǒng)crontab定時(shí)調(diào)度,支持為相關(guān)日志文件(或其他文件)自定義存儲(chǔ)規(guī)則,但日志內(nèi)容只能按照應(yīng)用服務(wù)組件的實(shí)現(xiàn)輸出。
logrotate提供的功能參數(shù)很多,比較常用的如下
日志分割周期
日志文件擴(kuò)展名
日志文件分割方式,包括新建+刪除,拷貝+清空,等,適用不同應(yīng)用服務(wù)場景
日志內(nèi)容壓縮
日志文件存檔數(shù)量
logrotate 命令格式: logrotate [OPTION...]-d, --debug :debug模式,測試配置文件是否有錯(cuò)誤。 -f, --force :強(qiáng)制轉(zhuǎn)儲(chǔ)文件。 -m, --mail=command :壓縮日志后,發(fā)送日志到指定郵箱。 -s, --state=statefile :使用指定的狀態(tài)文件。 -v, --verbose :顯示轉(zhuǎn)儲(chǔ)過程。 vi /etc/logrotate.d/nginx #在/etc/logrotate.d/目錄下新建nginx文件,內(nèi)容如下: /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 } #調(diào)用方法 logrotate -d /etc/logrotate.d/nginx #結(jié)合crontab定時(shí)執(zhí)行 echo "0 0 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/nginx > /dev/null 2>&1" >> /var/spool/cron/root #參數(shù)說明: compress 通過gzip 壓縮轉(zhuǎn)儲(chǔ)以后的日志 nocompress 不做gzip壓縮處理 copytruncate 用于還在打開中的日志文件,把當(dāng)前日志備份并截?cái)?;是先拷貝再清空的方式,拷貝和清空之間有一個(gè)時(shí)間差,可能會(huì)丟失部分日志數(shù)據(jù)。 nocopytruncate 備份日志文件不過不截?cái)?create mode owner group 輪轉(zhuǎn)時(shí)指定創(chuàng)建新文件的屬性,如create 0777 nobody nobody nocreate 不建立新的日志文件 delaycompress 和compress 一起使用時(shí),轉(zhuǎn)儲(chǔ)的日志文件到下一次轉(zhuǎn)儲(chǔ)時(shí)才壓縮 nodelaycompress 覆蓋 delaycompress 選項(xiàng),轉(zhuǎn)儲(chǔ)同時(shí)壓縮。 missingok 如果日志丟失,不報(bào)錯(cuò)繼續(xù)滾動(dòng)下一個(gè)日志 errors address 專儲(chǔ)時(shí)的錯(cuò)誤信息發(fā)送到指定的Email 地址 ifempty 即使日志文件為空文件也做輪轉(zhuǎn),這個(gè)是logrotate的缺省選項(xiàng)。 notifempty 當(dāng)日志文件為空時(shí),不進(jìn)行輪轉(zhuǎn) mail address 把轉(zhuǎn)儲(chǔ)的日志文件發(fā)送到指定的E-mail 地址 nomail 轉(zhuǎn)儲(chǔ)時(shí)不發(fā)送日志文件 olddir directory 轉(zhuǎn)儲(chǔ)后的日志文件放入指定的目錄,必須和當(dāng)前日志文件在同一個(gè)文件系統(tǒng) noolddir 轉(zhuǎn)儲(chǔ)后的日志文件和當(dāng)前日志文件放在同一個(gè)目錄下 sharedscripts 運(yùn)行postrotate腳本,作用是在所有日志都輪轉(zhuǎn)后統(tǒng)一執(zhí)行一次腳本。如果沒有配置這個(gè),那么每個(gè)日志輪轉(zhuǎn)后都會(huì)執(zhí)行一次腳本 prerotate 在logrotate轉(zhuǎn)儲(chǔ)之前需要執(zhí)行的指令,例如修改文件的屬性等動(dòng)作;必須獨(dú)立成行 postrotate 在logrotate轉(zhuǎn)儲(chǔ)之后需要執(zhí)行的指令,例如重新啟動(dòng) (kill -HUP) 某個(gè)服務(wù)!必須獨(dú)立成行 daily 指定轉(zhuǎn)儲(chǔ)周期為每天 weekly 指定轉(zhuǎn)儲(chǔ)周期為每周 monthly 指定轉(zhuǎn)儲(chǔ)周期為每月 rotate count 指定日志文件刪除之前轉(zhuǎn)儲(chǔ)的次數(shù),0 指沒有備份,5 指保留5 個(gè)備份 dateext 使用當(dāng)期日期作為命名格式 dateformat .%s 配合dateext使用,緊跟在下一行出現(xiàn),定義文件切割后的文件名,必須配合dateext使用,只支持 %Y %m %d %s 這四個(gè)參數(shù) size(或minsize) log-size 當(dāng)日志文件到達(dá)指定的大小時(shí)才轉(zhuǎn)儲(chǔ),log-size能指定bytes(缺省)及KB (sizek)或MB(sizem). #當(dāng)日志文件 >= log-size 的時(shí)候就轉(zhuǎn)儲(chǔ)。以下為合法格式:(其他格式的單位大小寫沒有試過) size = 5 或 size 5 (>= 5 個(gè)字節(jié)就轉(zhuǎn)儲(chǔ)) 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 }
附錄:關(guān)于常用組件運(yùn)行時(shí)日志管理
nginx不支持自動(dòng)清理,默認(rèn)單文件持續(xù)寫入,且不會(huì)自動(dòng)滾動(dòng)
mysql不支持自動(dòng)清理,默認(rèn)單文件持續(xù)寫入,且不會(huì)自動(dòng)滾動(dòng)
zookeeper默認(rèn)支持自動(dòng)清理(限制文件大小和個(gè)數(shù)),log4j配置文件維護(hù)
redis不支持自動(dòng)清理,只記錄少量核心日志,單文件持續(xù)寫入,但默認(rèn)只記錄少量核心日志,可以不處理
kafka的數(shù)據(jù)記錄日志(topic、offset等),支持自動(dòng)清理,配置文件維護(hù)
kafka操作日志,默認(rèn)在安裝目錄logs目錄,支持自動(dòng)滾動(dòng),但不會(huì)自動(dòng)清理,log4j配置文件維護(hù)
鏈接:https://www.cnblogs.com/xiaoyaozhe/p/17671275.html
-
Linux
+關(guān)注
關(guān)注
87文章
11399瀏覽量
212018 -
文件
+關(guān)注
關(guān)注
1文章
575瀏覽量
25058 -
MySQL
+關(guān)注
關(guān)注
1文章
838瀏覽量
27230 -
日志
+關(guān)注
關(guān)注
0文章
140瀏覽量
10777
原文標(biāo)題:Linux日志管理經(jīng)驗(yàn)總結(jié)(crontab+logrotate)
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Altera SOPC專題競賽-經(jīng)驗(yàn)總結(jié)
電源制作高手經(jīng)驗(yàn)總結(jié)
SOPC Builder/Nios 學(xué)習(xí)經(jīng)驗(yàn)總結(jié)

評(píng)論