摘要:日志文件總管日志輪轉(zhuǎn)工具可以自動(dòng)對(duì)日志文件提供截?cái)鄩嚎s以及輪轉(zhuǎn)的功能。使用假設(shè)我們現(xiàn)在有一個(gè)日志文件存儲(chǔ)在,需要對(duì)其每日進(jìn)行切分為新舊兩個(gè)日志文件,并刪除天前的舊日志。以后系統(tǒng)就會(huì)對(duì)該日志進(jìn)行自動(dòng)的輪轉(zhuǎn)管理。
部署網(wǎng)絡(luò)應(yīng)用時(shí),會(huì)對(duì)請(qǐng)求進(jìn)行日志保存,用于數(shù)據(jù)統(tǒng)計(jì)分析以及故障排除,但對(duì)于高并發(fā)請(qǐng)求的服務(wù)器,日志文件會(huì)迅速增長(zhǎng),快速的消耗磁盤(pán)空間,同時(shí),分析一個(gè)大文件來(lái)排查問(wèn)題也會(huì)非常慢。因此,我們通常需要將日志按照天級(jí)別進(jìn)行存儲(chǔ),并對(duì)過(guò)舊的日志進(jìn)行壓縮轉(zhuǎn)存或刪除,方便節(jié)省磁盤(pán)空間和進(jìn)行腳本分析。
當(dāng)我第一次有這種需求的時(shí)候,最先想到的是crontab腳本定時(shí)執(zhí)行日志清理腳本。就是先編寫(xiě)一個(gè)cleanLog.sh,然后讓crontab定期的來(lái)執(zhí)行它。這個(gè)方法可行,但是比較麻煩費(fèi)事,此時(shí)一個(gè)Linux內(nèi)置的工具就比較有用了:logrotate。
logrotate: Linux日志文件總管logrotate(日志輪轉(zhuǎn)工具)可以自動(dòng)對(duì)日志文件提供截?cái)?、壓縮以及輪轉(zhuǎn)的功能。
logrotate工具默認(rèn)安裝在linux機(jī)器上,全局命令在/usr/sbin/logrotate,另外還包含兩個(gè)配置文件:
// 全局配置文件,存儲(chǔ)的為公用的默認(rèn)配置項(xiàng) /etc/logrotate.conf // 子項(xiàng)配置文件夾,該文件夾下提供一些系統(tǒng)級(jí)別的日志配置,你的自定義配置也需要配置在這里 /etc/logrotate.d/
這個(gè)工具能做到自動(dòng)執(zhí)行的功能,其實(shí)還是依賴于crontab工具,只不過(guò)這些設(shè)定系統(tǒng)自動(dòng)完成了,我們可以查看crontab系統(tǒng)級(jí)別的日運(yùn)行腳本:
$ vim /etc/cron.daily/logrotate #!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1 EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0
可以看到在crontab的日級(jí)別配置文件目錄下有一個(gè)logrotate子項(xiàng),它會(huì)每天執(zhí)行logrotate命令,調(diào)用的配置為/etc/logrotate.conf。
在實(shí)際執(zhí)行中,logrotate命令會(huì)先讀取/etc/logrotate.conf的配置作為默認(rèn)項(xiàng),然后再依次讀取/etc/logrotate.d/目錄下的各文件配置來(lái)覆蓋默認(rèn)項(xiàng),并執(zhí)行日志輪轉(zhuǎn)功能。
logrotate命令語(yǔ)法:logrotate [OPTION...]logrotate使用
參數(shù)說(shuō)明:
-d, --debug :debug模式,測(cè)試配置文件是否有錯(cuò)誤。
-f, --force :強(qiáng)制轉(zhuǎn)儲(chǔ)文件。
-m, --mail=command :壓縮日志后,發(fā)送日志到指定郵箱。
-s, --state=statefile :使用指定的狀態(tài)文件。
-v, --verbose :顯示轉(zhuǎn)儲(chǔ)過(guò)程。
假設(shè)我們現(xiàn)在有一個(gè)日志文件存儲(chǔ)在/home/work/log/nginx.access.log,需要對(duì)其每日進(jìn)行切分為新舊兩個(gè)日志文件,并刪除7天前的舊日志。
首先我們創(chuàng)建新的日志輪轉(zhuǎn)配置:
$vim /etc/logrotate.d/nginxAccessLog # 指定需要輪轉(zhuǎn)處理的日志文件 /home/work/log/nginx.access.log { # 日志文件輪轉(zhuǎn)周期,可用值為: daily/weekly/yearly daily # 新日志文件的權(quán)限 create 0664 work work # 輪轉(zhuǎn)次數(shù),即最多存儲(chǔ)7個(gè)歸檔日志,會(huì)刪除最久的歸檔日志 rotate 7 # 以當(dāng)前日期作為命名格式 dateext # 輪循結(jié)束后,已歸檔日志使用gzip進(jìn)行壓縮 compress # 與compress共用,最近的一次歸檔不要壓縮 delaycompress # 忽略錯(cuò)誤信息 missingok # 日志文件為空,輪循不會(huì)繼續(xù)執(zhí)行 notifempty # 當(dāng)日志文件大于指定大小時(shí),才繼續(xù)執(zhí)行,單位為bytes(默認(rèn))/k/M/G size = 100M # 將日志文件轉(zhuǎn)儲(chǔ)后執(zhí)行的命令,以endscript結(jié)尾,命令需要多帶帶成行 postrotate # 重啟nginx日志服務(wù),寫(xiě)入到新的文件中去,否則會(huì)依然寫(xiě)入重命名后的文件中 /bin/kill -USR1 `cat /home/work/run/nginx.pid 2> /dev/null` 2> /dev/null || true # 默認(rèn)logrotate會(huì)以root身份運(yùn)行,如果想要以其他身份執(zhí)行一個(gè)命令,可以這樣使用: #su - work -c "/home/work/odp/webserver/loadnginx.sh restart" endscript }
在使用前,我們先演練一下,也就是debug模式,此時(shí),不用實(shí)際輪循,而是模擬并輸出,使用強(qiáng)制執(zhí)行是因?yàn)檫€沒(méi)到輪循周期:
$logrotate -d -f /etc/logrotate.d/nginxAccessLog reading config file /etc/logrotate.d/nginxAccessLog reading config info for /home/work/log/nginx.access.log Handling 1 logs rotating pattern: /home/work/log/nginx.access.log forced from command line (7 rotations) empty log files are rotated, old logs are removed considering log /home/work/log/nginx.access.log log needs rotating rotating log /home/work/log/nginx.access.log, log->rotateCount is 7 dateext suffix "-20190228" glob pattern "-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" glob finding old rotated logs failed renaming /home/work/log/nginx.access.log to /home/work/log/nginx.access.log-20190228 creating new /home/work/log/nginx.access.log mode = 0664 uid = 500 gid = 501 running postrotate script running script with arg /home/work/log/nginx.access.log: " /bin/kill -USR1 `cat /home/work/run/nginx.pid 2> /dev/null` 2> /dev/null || true "
可以看到整個(gè)執(zhí)行流程,以及沒(méi)有什么報(bào)錯(cuò)信息,此時(shí)我們直接繼續(xù)執(zhí)行:
$logrotate -f /etc/logrotate.d/nginxAccessLog $ll /home/work/lnmp/log/ -rw-r--r-- 1 work work 0 Feb 28 13:40 nginx.access.log -rw-r--r-- 1 work work 5379846 Feb 28 13:37 nginx.access.log-20190228
可以看到我們已經(jīng)對(duì)日志進(jìn)行了切分,最新的日志文件大小為0。以后系統(tǒng)就會(huì)對(duì)該日志進(jìn)行自動(dòng)的輪轉(zhuǎn)管理。
參考資料Linux日志文件總管——logrotate:https://linux.cn/article-4126...
logrotate-(8) manual page:https://linuxconfig.org/logro...
運(yùn)維中的日志切割操作梳理:https://www.cnblogs.com/kevin...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/40363.html
摘要:使用管理日志標(biāo)簽空格分隔日志管理本文作者是,本文原文地址是當(dāng)前版本的一個(gè)問(wèn)題就是日志管理。任何長(zhǎng)時(shí)間運(yùn)行的進(jìn)程產(chǎn)生的日志都是冗長(zhǎng)的,這會(huì)導(dǎo)致仔細(xì)檢查非常困難。所有文件這時(shí)能被轉(zhuǎn)發(fā)到一個(gè)中央日志系統(tǒng)。 使用 Fluentd 管理 Docker 日志 標(biāo)簽(空格分隔): Fluentd Docker 日志管理 本文作者是 jwilder,本文原文地址是 Docker Log M...
閱讀 2653·2023-04-25 20:50
閱讀 4133·2023-04-25 18:45
閱讀 2281·2021-11-17 17:00
閱讀 3391·2021-10-08 10:05
閱讀 3143·2019-08-30 15:55
閱讀 3584·2019-08-30 15:44
閱讀 2408·2019-08-29 13:51
閱讀 1176·2019-08-29 12:47