日志就像程序的生命記錄儀,詳細(xì)記錄下了程序運(yùn)行的點(diǎn)點(diǎn)滴滴。
記錄哪些日志需要你在編寫應(yīng)用程序慎重決定,本文講述如何使用linux自帶的logrotate程序來精心組織我們可愛的日志文件。
日志,實(shí)際就是本文文件,且是個(gè)內(nèi)容不斷在增長(zhǎng)的文件。處理通常就是按天或者按大小來備份、壓縮或轉(zhuǎn)儲(chǔ),非常簡(jiǎn)單。
/var/log/messages
是大家熟悉的系統(tǒng)日志存放位置。如果該文件內(nèi)容增長(zhǎng)特別快,幾天可能就撐滿了整個(gè)硬盤,那么對(duì)該文件的備份、壓縮或轉(zhuǎn)儲(chǔ)就顯得尤為重要。
手動(dòng)怎么處理呢?可能是:
Logrotate實(shí)際就是起著上述腳本作用的小工具,他通過讓用戶來配置規(guī)則的方式,檢測(cè)和處理日志文件。配合Cron可讓處理定時(shí)化;
Logrotate預(yù)制了大量判斷條件和處理方式,可大大降低手寫腳本的負(fù)擔(dān)和出錯(cuò)的可能;
Logrorate檢測(cè)日志文件屬性,比對(duì)用戶配置好的檢測(cè)條件,對(duì)滿足條件的再根據(jù)用戶配置的要求來處理,整個(gè)可以通過Cron來定時(shí)調(diào)度,這其實(shí)是非常經(jīng)典的Linux解決問題的思路,可以好好靜下心來品味下,簡(jiǎn)單,好用。
以下是logrotate運(yùn)行的關(guān)鍵點(diǎn):
/usr/bin/logrotate
程序所在位置;/etc/cron.daily/logrotate
默認(rèn)讓Cron每天執(zhí)行l(wèi)ogrotate一次;/etc/logrotate.conf
全局配置文件;/etc/logrotate.d
應(yīng)用自個(gè)的配置文件存放目錄,覆蓋全局配置;/etc/logrotate.conf
# cat /etc/logrotate.conf# see "man logrotate" for details# rotate log files weeklyweekly# keep 4 weeks worth of backlogsrotate 4# create new (empty) log files after rotating old onescreate# use date as a suffix of the rotated file# dateext# uncomment this if you want your log files comPRessed#compress# RPM packages drop log rotation information into this directoryinclude /etc/logrotate.d# no packages own wtmp and btmp -- we'll rotate them here/var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1}/var/log/btmp { missingok monthly create 0600 root utmp rotate 1}# system-specific logs may be also be configured here.
查看全局配置文件cat /etc/logrotate.conf
,可以發(fā)現(xiàn)#
是行注釋,配置項(xiàng)都是以關(guān)鍵字形式出現(xiàn)(那么想知道每個(gè)關(guān)鍵字的作用,最簡(jiǎn)單的就是直接man查看了)。
仔細(xì)看下每個(gè)關(guān)鍵字的注釋,不難發(fā)現(xiàn),比如:
/etc/logrotate.d
目錄,或者直接放在全局配置里面。于是當(dāng)logrotate
程序被執(zhí)行時(shí),按照字面意思logrotate
默認(rèn)是想每周處理下日志,對(duì)日志最多輪轉(zhuǎn)保留4份,處理方式是不壓縮也不加時(shí)間戳,處理完后再生成個(gè)同名文件。當(dāng)然這些是默認(rèn)設(shè)置,還對(duì)wtmp和btmp日志處理做了單獨(dú)要求并且include /etc/logrotate.d
目錄下還有一大堆處理要求。該目錄下配置文件,在logrotate
被執(zhí)行后,都會(huì)不一個(gè)個(gè)讀取來執(zhí)行。
/etc/logrotate.d/
# ls /etc/logrotate.d/cups debug dracut httpd iptraf MySQLd ppp psacct sssd subscription-manager syslog tomcat6 up2date vsftpd wpa_supplicant yum
例如查看下sssd
配置文件的內(nèi)容:
# cat /etc/logrotate.d/sssd/var/log/sssd/*.log { weekly missingok notifempty sharedscripts rotate 2 compress postrotate /bin/kill -HUP `cat /var/run/sssd.pid 2>/dev/null` 2> /dev/null || true endscript}
可以發(fā)現(xiàn)基本格式與全局配置文件/etc/logrotate.conf
一致,不難想象單獨(dú)為某個(gè)日志配置的要求優(yōu)先級(jí)肯定更高,如果與全局配置中出現(xiàn)相同項(xiàng)目的配置,單獨(dú)的肯定覆蓋全局的。
/etc/cron.daily/logrotate
配置文件都指定完畢,logrotate可單獨(dú)執(zhí)行了,當(dāng)然也可以通過cron來定時(shí)執(zhí)行;
# cat /etc/cron.daily/logrotate#!/bin/sh/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1EXITVALUE=$?if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"fiexit 0
默認(rèn)的logrotate已經(jīng)放在/etc/cron.daily/logrotate
目錄,很明顯是讓cron每天執(zhí)行一次logrotate程序;
當(dāng)然你也可以將該腳本放到其他時(shí)間,比如每分鐘執(zhí)行,甚至可以單獨(dú)寫crontab表達(dá)式來讓logrotate指定配置文件和指定時(shí)間執(zhí)行;
至此,我們看過了logrotate的全局配置文件,單獨(dú)配置文件,已經(jīng)如何配合cront來定時(shí)執(zhí)行。
為了加深記憶,我們先小結(jié)下:
man過logrotate的同學(xué)大概知道logrotate該怎么用了,常見的選項(xiàng)使用如下:
# 1. 調(diào)試 (d = debug)參數(shù)為配置文件,不指定則執(zhí)行全局配置文件logrotate -d /etc/logrotate.d/test.conf# 2. 強(qiáng)制執(zhí)行(-f = force),可以配合-v(-v =verbose)使用,注意調(diào)試信息默認(rèn)攜帶-v;logrotate -v -f /etc/logrotate.d/test.conf
本例通過自定義配置文件來壓縮指定日志文件來測(cè)試logrotate的使用。
注意logrotate都是需要使用root來執(zhí)行的,(但是可以通過配置項(xiàng)來指定生成的日志文件為普通用戶的)。
# 1. 生成一個(gè)日志文件man ps > test.logll -h test.log-rw-r--r-- 1 root root 54K Sep 6 11:36 test.log# 2. 編寫對(duì)該日志文件如何處理的logrotate配置文件cat /etc/logrotate.d/test.conf/var/log/test.log {compressrotate 4size 30kcreate 0600 root root}# 3. 調(diào)試是否可以按照配置文件要求生成壓縮文件logrotate -d /etc/logrotate.d/test.confreading config file /etc/logrotate.d/test.confreading config info for /var/log/test.logHandling 1 logsrotating pattern: /var/log/test.log 30720 bytes (4 rotations)empty log files are rotated, old logs are removedconsidering log /var/log/test.log log needs rotatingrotating log /var/log/test.log, log->rotateCount is 4dateext suffix '-20150906'glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'renaming /var/log/test.log.4.gz to /var/log/test.log.5.gz (rotatecount 4, logstart 1, i 4),renaming /var/log/test.log.3.gz to /var/log/test.log.4.gz (rotatecount 4, logstart 1, i 3),renaming /var/log/test.log.2.gz to /var/log/test.log.3.gz (rotatecount 4, logstart 1, i 2),renaming /var/log/test.log.1.gz to /var/log/test.log.2.gz (rotatecount 4, logstart 1, i 1),renaming /var/log/test.log.0.gz to /var/log/test.log.1.gz (rotatecount 4, logstart 1, i 0),renaming /var/log/test.log to /var/log/test.log.1creating new /var/log/test.log mode = 0600 uid = 0 gid = 0compressing log with: /bin/gzipremoving old log /var/log/test.log.5.gzerror: error opening /var/log/test.log.5.gz: No such file or directory# 4. 調(diào)試結(jié)果正常,實(shí)際測(cè)試下logrotate -f /etc/logrotate.d/test.confll -h test.log*-rw------- 1 root root 0 Sep 6 11:44 test.log-rw-r--r-- 1 root root 14K Sep 6 11:44 test.log.1.gz
測(cè)試正常;
以上logrotate -f /etc/logrotate.d/test.conf
指令完全可以寫入crontab中,按照要求時(shí)間來執(zhí)行,此處暫時(shí)不拆開講了。
我們從上述debug信息中,摘錄輪轉(zhuǎn)部分的日志來理解下,什么叫輪轉(zhuǎn)。
rotating log /var/log/test.log, log->rotateCount is 4renaming /var/log/test.log.4.gz to /var/log/test.log.5.gz (rotatecount 4, logstart 1, i 4),renaming /var/log/test.log.3.gz to /var/log/test.log.4.gz (rotatecount 4, logstart 1, i 3),renaming /var/log/test.log.2.gz to /var/log/test.log.3.gz (rotatecount 4, logstart 1, i 2),renaming /var/log/test.log.1.gz to /var/log/test.log.2.gz (rotatecount 4, logstart 1, i 1),renaming /var/log/test.log.0.gz to /var/log/test.log.1.gz (rotatecount 4, logstart 1, i 0),renaming /var/log/test.log to /var/log/test.log.1emoving old log /var/log/test.log.5.gzerror: error opening /var/log/test.log.5.gz: No such file or directory
根據(jù)配置文件要求,輪轉(zhuǎn)4份;
以偽代碼在簡(jiǎn)寫上述日志為:
rotateCount=4mv 4 5mv 3 4mv 2 3mv 1 2rm 5
這就很容易理解了,所謂輪轉(zhuǎn),就是類似二級(jí)制向右位移一樣不斷的重命名;
在弄清楚logrotate的運(yùn)作機(jī)制,又實(shí)地測(cè)試一番后,以下將通過多個(gè)例子方式來讓大家快速配置。
copytruncate的作用在于先復(fù)制一份當(dāng)前日志文件用做處理,再清空源日志文件,讓其繼續(xù)接收日志。
當(dāng)然在復(fù)制和清空的空隙可能會(huì)有若干
$ cat logrotate.conf /tmp/output.log { size 1k copytruncate create 700 bala bala rotate 4 compress }
摘自參考3;
postrotate和endscript中間可以編寫自定義腳本,用來對(duì)日志或者其他其定義處理,擴(kuò)展性非常強(qiáng);
例如由于logrotate對(duì)壓縮日志可指定的時(shí)間戳只能到天,于是可以再自定義腳本里面對(duì)文件做時(shí)分等細(xì)化命名;
$ cat logrotate.conf /tmp/output.log { size 1k copytruncate rotate 4 compress postrotate /home/bala/myscript.sh endscript }
摘自參考3;
默認(rèn)壓縮程序使用.gz
,當(dāng)然可以自定義,需要制定壓縮程序和后綴名;
$ cat logrotate.conf /tmp/output.log { size 1k copytruncate create compress compresscmd /bin/bzip2 compressext .bz2 rotate 4 }
新聞熱點(diǎn)
疑難解答
圖片精選