比較簡便不影響服務(wù)的方法是:先復(fù)制,后清空
cp/path/to/apache/log/access_log/path/to/apache/log/access_log_yesterday
echo>/path/to/apache/log/access_log
嚴(yán)肅的分析員會這樣做發(fā)現(xiàn)一個問題:
但cp不可能嚴(yán)格保證嚴(yán)格的0點(diǎn)截斷,
多服務(wù)器的日志合并統(tǒng)計2
。加入復(fù)制過程用了6秒,截斷的access_log_yesterday日志中會出現(xiàn)復(fù)制過程到00:00:06期間的日志。對于單個日志統(tǒng)計這些每天多出來幾百行日志是沒有問題的。但對于多個日志在跨月的1天會有一個合并的排序問題:[31/Mar/2002:59:59:59+0800]
[31/Mar/2002:23:59:59+0800]
[01/Apr/2002:00:00:00+0800]
[01/Apr/2002:00:00:00+0800]
要知道[01/Apr/2002:00:00:00這個字段是不可以進(jìn)行"跨天排序"的。因為日期中使用了dd/mm/yyyy,月份還是英文名,如果按照字母排序,很有可能是這樣的結(jié)果:排序?qū)е铝巳罩镜腻e誤
[01/Apr/2002:00:00:00+0800]
[01/Apr/2002:00:00:00+0800]
[01/Apr/2002:00:00:00+0800]
[01/Apr/2002:00:00:00+0800]
[01/Apr/2002:00:00:00+0800]
[01/Apr/2002:00:00:00+0800]
[01/Apr/2002:00:00:00+0800]
[31/Mar/2002:59:59:59+0800]
[31/Mar/2002:59:59:59+0800]
[31/Mar/2002:23:59:59+0800]
[31/Mar/2002:59:59:59+0800]
[31/Mar/2002:23:59:59+0800]
這些跨天過程中的非正常數(shù)據(jù)對于webalizer等分析工具來說簡直就好像是吃了一個臭蟲一樣,運(yùn)行的結(jié)果是:它可能會把前一個月所有的數(shù)據(jù)都丟失!因此這樣的數(shù)據(jù)會有很多風(fēng)險出現(xiàn)在處理上月最后一天的數(shù)據(jù)的過程中,
電腦資料
《多服務(wù)器的日志合并統(tǒng)計2》(http://www.lotusphilosophies.com)。問題的解決有幾個思路:
1)事后處理
所以一個事后的處理的方法是:用grep命令在每月第1天將日志跨月的日志去掉,比如:
grep-v"01/Apr"access_log_04_01>access_log_new
修改SORT后的日志:所有跨天的數(shù)據(jù)去掉。也許對日志的事后處理是一個途徑,雖然sort命令中有對日期排序的特殊選項-M(注意是:大寫M),可以讓指定字段按照英文月份排序而非字母順序,但對于apache日志來說,用SORT命令切分出月份字段很麻煩。(我嘗試過用"/"做分割符,并且使用"月份""年:時間"這兩個字段排序)。雖然用一些PERL的腳本肯定可以實(shí)現(xiàn),但最終我還是放棄了。這不符合系統(tǒng)管理員的設(shè)計原則:通用性。并且你需要一直問自己:有沒有更簡單的方法呢?還有就是將日志格式改成用TIMESTAMP(象SQUID的日志就沒有這個問題,它的日志本身就是使用TIMESTAMP做時間戳的),但我無法保證所有的日志工具都能識別你在日期這個字段使用了特別的格式。
2)優(yōu)化數(shù)據(jù)源
最好的辦法還是優(yōu)化數(shù)據(jù)源。將數(shù)據(jù)源保證按天輪循,同一天的日志中的數(shù)據(jù)都在同一天內(nèi)。這樣以后你無論使用什么工具(商業(yè)的,免費(fèi)的)來分析日志,都不會因為日志復(fù)雜的預(yù)處理機(jī)制受到影響。
首先可能會想到的是控制截取日志的時間:比如嚴(yán)格從0點(diǎn)開始截取日志,但在子夜前1分鐘還是后一分鐘開始截取是沒有區(qū)別的,你仍然無法控制一個日志中有跨2天記錄的問題,而且你也無法預(yù)測日志歸檔過程使用的時間。
因此必須要好好考慮一下使用日志輪循工具的問題,這些日志輪循工具要符合:
1)不中斷WEB服務(wù):不能停apache=>移動日志=>重啟apache;
2)保證同一天日志能夠按天輪循:每天一個日志00:00:00-23:59:59;
3)不受apache重啟的影響:如果apache每次重啟都會生成一個新的日志是不符合要求的;
4)安裝配置簡單。
首先考慮了apache/bin目錄下自帶的一個輪循工具:rotatelogs這個工具基本是用來按時間或按大小控制日志的,無法控制何時截斷和如何按天歸檔。
然后考慮logrotate后臺服務(wù):logrotate是一個專門對各種系統(tǒng)日志(syslogd,mail)進(jìn)行輪循的后臺服務(wù),比如SYSTEMLOG,但其配置比較復(fù)雜,放棄,實(shí)際上它也是對相應(yīng)服務(wù)進(jìn)程發(fā)出一個-HUP重啟命令來實(shí)現(xiàn)日志的截斷歸檔的。