Linux日志文件如果不定期清理,會(huì)填滿整個(gè)磁盤。這樣會(huì)很危險(xiǎn),因此日志管理是系統(tǒng)管理員日常工作之一。我們可以使用”logrotate”來管理linux日志文件,它可以實(shí)現(xiàn)日志的自動(dòng)滾動(dòng),日志歸檔等功能。下面以nginx日志文件來講解下logrotate的用法。

#vim?/etc/logrotate.d/nginx/usr/local/nginx/logs/*.log?{
daily
rotate?5
missingok
dateext
compress
notifempty
sharedscripts
postrotate
????[?-e?/var/run/nginx.pid?]?&&?kill?-USR1?`cat?/var/run/nginx.pid`?]
endscript
}

注釋:
/usr/local/nginx/logs/*.log:需要輪詢?nèi)罩韭窂?br/>daily:每天輪詢
rotate 5:保留最多5次滾動(dòng)的日志
missingok:如果日志丟失,不報(bào)錯(cuò)繼續(xù)滾動(dòng)下一個(gè)日志
dateext:使用日期作為命名格式
compress:通過gzip壓縮轉(zhuǎn)儲(chǔ)以后的日志
notifempty:當(dāng)日志為空時(shí)不進(jìn)行滾動(dòng)
/var/run/nginx.pid:?nginx?pid位置,請(qǐng)查看nginx.conf
postrotate/endscript:在截?cái)噢D(zhuǎn)儲(chǔ)以后需要執(zhí)行的命令

立即截?cái)嗫蓤?zhí)行下面

/usr/sbin/logrotate?-f?/etc/logrotate.d/nginx

注:
由于logratate已經(jīng)加到cron.daily(/etc/cron.daily/logrotate),不再需要加到計(jì)劃任務(wù)中

ogrotate的演示

按天保存一周的Nginx日志壓縮文件,配置文件為「/etc/logrotate.d/nginx」:

/usr/local/nginx/logs/*.log?{
????daily
????dateext
????compress
????rotate?7
????sharedscripts
????postrotate
????????kill?-USR1?`cat?/var/run/nginx.pid`
????endscript
}

如果你等不及CRON,可以通過如下命令來手動(dòng)執(zhí)行:

shell>?logrotate?-f?/etc/logrotate.d/nginx

當(dāng)然,正式執(zhí)行前最好通過Debug選項(xiàng)來驗(yàn)證一下,這對(duì)調(diào)試也很重要:

shell>?logrotate?-d?-f?/etc/logrotate.d/nginx

BTW:類似的還有Verbose選項(xiàng),這里就不多說了。

Logrotate的疑問

問題:sharedscripts的作用是什么?

大家可能注意到了,我在前面Nginx的例子里聲明日志文件的時(shí)候用了星號(hào)通配符,也就是說這里可能涉及多個(gè)日志文件,比如:access.log和error.log。說到這里大家或許就明白了,sharedscripts的作用是在所有的日志文件都輪轉(zhuǎn)完畢后統(tǒng)一執(zhí)行一次腳本。如果沒有配置這條指令,那么每個(gè)日志文件輪轉(zhuǎn)完畢后都會(huì)執(zhí)行一次腳本。

問題:rotate和maxage的區(qū)別是什么?

它們都是用來控制保存多少日志文件的,區(qū)別在于rotate是以個(gè)數(shù)為單位的,而maxage是以天數(shù)為單位的。如果我們是以按天來輪轉(zhuǎn)日志,那么二者的差別就不大了。

問題:為什么生成日志的時(shí)間是凌晨四五點(diǎn)?

前面我們說過,Logrotate是基于CRON運(yùn)行的,所以這個(gè)時(shí)間是由CRON控制的,具體可以查詢CRON的配置文件「/etc/crontab」,可以手動(dòng)改成如23:59等時(shí)間執(zhí)行:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

#?run-parts
01?*?*?*?*?root?run-parts?/etc/cron.hourly
59?23?*?*?*?root?run-parts?/etc/cron.daily
22?4?*?*?0?root?run-parts?/etc/cron.weekly
42?4?1?*?*?root?run-parts?/etc/cron.monthly

如果使用的是新版CentOS,那么配置文件為:/etc/anacrontab。

問題:如何告訴應(yīng)用程序重新打開日志文件?

以Nginx為例,是通過postrotate指令發(fā)送USR1信號(hào)來通知Nginx重新打開日志文件的。但是其他的應(yīng)用程序不一定遵循這樣的約定,比如說MySQL是通過flush-logs來重新打開日志文件的。更有甚者,有些應(yīng)用程序就壓根沒有提供類似的方法,此時(shí)如果想重新打開日志文件,就必須重啟服務(wù),但為了高可用性,這往往不能接受。還好Logrotate提供了一個(gè)名為copytruncate的指令,此方法采用的是先拷貝再清空的方式,整個(gè)過程中日志文件的操作句柄沒有發(fā)生改變,所以不需要通知應(yīng)用程序重新打開日志文件,但是需要注意的是,在拷貝和清空之間有一個(gè)時(shí)間差,所以可能會(huì)丟失部分日志數(shù)據(jù)。