欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
多服務(wù)器的日志合并統計——apache日志的cronolog輪循 (筆記 by 車(chē)東)

多服務(wù)器的日志合并統計——apache日志的cronolog輪循


內容摘要:你完全不必耐心地看完下面的所有內容,因為結論無(wú)非以下2點(diǎn):
1 用 cronolog 干凈,安全地輪循apache“日”志
2 用 sort -m 合并排序多個(gè)日志

根據個(gè)人的使用經(jīng)歷:
1 先介紹apache日志的合并方法;
2 然后根據由此引出的問(wèn)題說(shuō)明日志輪循的必要性和解決方法,介紹如何通過(guò)cronolog對apache日志進(jìn)行輪循;
中間有很多在設計日志合并過(guò)程中一些相關(guān)工具的使用技巧和一些嘗試的失敗經(jīng)歷……
我相信解決以上問(wèn)題的路徑不止這一條途徑,以下方案肯定不是最簡(jiǎn)便或者說(shuō)成本最低的,希望能和大家有更多的交流。


多服務(wù)器日志合并統計的必要性

越來(lái)越多大型的WEB服務(wù)使用DNS輪循來(lái)實(shí)現負載均衡:使用多個(gè)同樣角色的服務(wù)器做前臺的WEB服務(wù),這大大方便了服務(wù)的分布規劃和擴展性,但多個(gè)服務(wù)器的分布使得日志的分析統計也變得有些麻煩。如果使用webalizer等日志分析工具對每臺機器分別做日志統計:
1 會(huì )對數據的匯總帶來(lái)很多麻煩,比如:統計的總訪(fǎng)問(wèn)量需要將SERVER1 SERVER2...上指定月份的數字相加。
2 會(huì )大大影響統計結果中唯一訪(fǎng)客數unique visits,唯一站點(diǎn)數uniquesites的等指標的統計,因為這幾個(gè)指標并非幾臺機器的代數相加。

統一日志統計所帶來(lái)的好處是顯而易見(jiàn)的,但如何把所有機器的統計合并到一個(gè)統計結果里呢?
首先也許會(huì )想:多個(gè)服務(wù)器能不能將日志記錄到同一個(gè)遠程文件里呢?我們不考慮使用遠程文件系統記錄日志的問(wèn)題,因為帶來(lái)的麻煩遠比你獲得的方便多的多……
因此,要統計的多個(gè)服務(wù)器的日志還是:分別記錄=>并通過(guò)一定方式定期同步到后臺=>合并=>后用日志分析工具來(lái)進(jìn)行分析。

首先,要說(shuō)明為什么要合并日志:因為webalizer沒(méi)有將同一天的多個(gè)日志合并的功能
先后運行
webalizer log1
webalizer log2
webalizer log3
這樣最后的結果是:只有log3的結果。

能不能將log1<<log2<<log3簡(jiǎn)單疊加呢?
因為一個(gè)日志的分析工具不是將日志一次全部讀取后進(jìn)行分析,而且流式的讀取日志并按一定時(shí)間間隔,保存階段性的統計結果。因此時(shí)間跨度過(guò)大(比如2條日志間隔超過(guò)5分鐘),一些日志統計工具的算法就會(huì )將前面的結果“忘掉”。因此,log1<<log2<<log3直接文件連接的統計結果還是:只有log3的統計結果。

多臺服務(wù)日志合并問(wèn)題:把多個(gè)日志中的記錄按時(shí)間排序后合并成一個(gè)文件

典型的多個(gè)日志文件的時(shí)間字段是這樣的:
log1 log2 log3
00:15:00 00:14:00 00:11:00
00:16:00 00:15:00 00:12:00
00:17:00 00:18:00 00:13:00
00:18:00 00:19:00 00:14:00
14:18:00 11:19:00 10:14:00
15:18:00 17:19:00 11:14:00
23:18:00 23:19:00 23:14:00

日志合并必須是按時(shí)間將多個(gè)日志的交叉合并。合并后的日志應該是:
00:15:00 來(lái)自log1
00:15:00 來(lái)自log2
00:16:00 來(lái)自log1
00:17:00 來(lái)自log3
00:18:00 來(lái)自log2
00:19:00 來(lái)自log1
....

如何合并多個(gè)日志文件?
下面以標準的clf格式日志(apache)為例:
apche的日志格式是這樣的:
%h %l %u %t \"%r\" %>s %b
具體的例子:
111.222.111.222 - - [03/Apr/2002:10:30:17 +0800] "GET /index.htmlHTTP/1.1" 200 419

最簡(jiǎn)單的想法是將日志一一讀出來(lái),然后按日志中的時(shí)間字段排序
cat log1 log2 log3 |sort -k 4 -t " "
注釋?zhuān)?br>-t " ": 日志字段分割符號是空格
-k 4: 按第4個(gè)字段排序,也就是:[03/Apr/2002:10:30:17 +0800] 這個(gè)字段
-o log_all: 輸出到log_all這個(gè)文件中

但這樣的效率比較低,要知道。如果一個(gè)服務(wù)已經(jīng)需要使用負載均衡,其服務(wù)的單機日志條數往往都超過(guò)了千萬(wàn)級,大小在幾百M,這樣要同時(shí)對多個(gè)幾百M的日志進(jìn)行排序,機器的負載可想而之……
其實(shí)有一個(gè)優(yōu)化的途徑,要知道:即使單個(gè)日志本身已經(jīng)是一個(gè)“已經(jīng)按照時(shí)間排好序“的文件了,而sort對于這種文件的排序合并提供了一個(gè)優(yōu)化合并算法:使用-m merge合并選項,
因此:合并這樣格式的3個(gè)日志文件log1 log2 log3并輸出到log_all中比較好方法是:
sort -m -t " " -k 4 -o log_all log1 log2 log3
注釋?zhuān)?br>-m: 使用 merge優(yōu)化算法

注意:合并后的日志輸出最好壓縮以后再發(fā)給webalizer處理
有的系統能處理2G的文件,有的不能。有的程序能處理大于2G的文件,有的不能。盡量避免大于2G的文件,除非確認所有參與處理的程序和操作系統都能處理這樣的文件。所以輸出后的文件如果大于2G,最好將日志gzip后再發(fā)給webalizer處理:大于2G的文件分析過(guò)程中文件系統出錯的可能性比較大,并且gzip后也能大大降低分析期間的I/O操作。

日志的按時(shí)間排序合并就是這樣實(shí)現的。

日志的輪循機制

讓我們關(guān)心一下數據源問(wèn)題:webalizer其實(shí)是一個(gè)按月統計的工具,支持增量統計:因此對于大型的服務(wù),我可以按天將apache的日志合并后送給webalizer統計。WEB日志是如何按天(比如每天子夜00:00:00)截斷呢?
如果你每天使用crontab:每天0點(diǎn)準時(shí)將日志備份成access_log_yesterday
mv /path/to/apache/log/access_log/path/to/apache/log/access_log_yesterday
的話(huà):你還需要:馬上運行一下:apache restart否則:apache會(huì )因為的日志文件句柄丟失不知道將日志記錄到哪里去了。這樣歸檔每天子夜重啟apache服務(wù)會(huì )受到影響。
比較簡(jiǎn)便不影響服務(wù)的方法是:先復制,后清空
cp /path/to/apache/log/access_log/path/to/apache/log/access_log_yesterday
echo >/path/to/apache/log/access_log

嚴肅的分析員會(huì )這樣做發(fā)現一個(gè)問(wèn)題:
但cp不可能?chē)栏癖WC嚴格的0點(diǎn)截斷。加入復制過(guò)程用了6秒,截斷的access_log_yesterday日志中會(huì )出現復制過(guò)程到00:00:06期間的日志。對于單個(gè)日志統計這些每天多出來(lái)幾百行日志是沒(méi)有問(wèn)題的。但對于多個(gè)日志在跨月的1天會(huì )有一個(gè)合并的排序問(wèn)題:
[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這個(gè)字段是不可以進(jìn)行“跨天排序”的。因為日期中使用了dd/mm/yyyy,月份還是英文名,如果按照字母排序,很有可能是這樣的結果:排序導致了日志的錯誤
[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]

這些跨天過(guò)程中的非正常數據對于webalizer等分析工具來(lái)說(shuō)簡(jiǎn)直就好像是吃了一個(gè)臭蟲(chóng)一樣,運行的結果是:它可能會(huì )把前一個(gè)月所有的數據都丟失!因此這樣的數據會(huì )有很多風(fēng)險出現在處理上月最后一天的數據的過(guò)程中。

問(wèn)題的解決有幾個(gè)思路:
1 事后處理:
。所以一個(gè)事后的處理的方法是:用grep命令在每月第1天將日志跨月的日志去掉,比如:
grep -v "01/Apr" access_log_04_01 > access_log_new

修改SORT后的日志:所有跨天的數據去掉。也許對日志的事后處理是一個(gè)途徑,雖然sort命令中有對日期排序的特殊選項-M(注意是:大寫(xiě)M),可以讓指定字段按照英文月份排序而非字母順序,但對于apache日志來(lái)說(shuō),用SORT命令切分出月份字段很麻煩。(我嘗試過(guò)用"/"做分割符,并且使用“月份”“年:時(shí)間”這兩個(gè)字段排序)。雖然用一些PERL的腳本肯定可以實(shí)現,但最終我還是放棄了。這不符合系統管理員的設計原則:通用性。并且你需要一直問(wèn)自己:有沒(méi)有更簡(jiǎn)單的方法呢?
還有就是將日志格式改成用TIMESTAMP(象SQUID的日志就沒(méi)有這個(gè)問(wèn)題,它的日志本身就是使用TIMESTAMP做時(shí)間時(shí)間戳的),但我無(wú)法保證所有的日志工具都能識別你在日期這個(gè)字段使用了特別的格式。

2 優(yōu)化數據源:
最好的辦法還是優(yōu)化數據源。將數據源保證按天輪循,同一天的日志中的數據都在同一天內。這樣以后你無(wú)論使用什么工具(商業(yè)的,免費的)來(lái)分析日志,都不會(huì )因為日志復雜的預處理機制受到影響。

首先可能會(huì )想到的是控制截取日志的時(shí)間:比如嚴格從0點(diǎn)開(kāi)始截取日志,但在子夜前1分鐘還是后一分鐘開(kāi)始截取是沒(méi)有區別的,你仍然無(wú)法控制一個(gè)日志中有跨2天記錄的問(wèn)題,而且你也無(wú)法預測日志歸檔過(guò)程使用的時(shí)間。
因此必須要好好考慮一下使用日志輪循工具的問(wèn)題,這些日志輪循工具要符合:
1 不中斷WEB服務(wù):不能停apache=>移動(dòng)日志=>重啟apache
2 保證同一天日志能夠按天輪循:每天一個(gè)日志00:00:00-23:59:59
3 不受apache重啟的影響:如果apache每次重啟都會(huì )生成一個(gè)新的日志是不符合要求的
4 安裝配置簡(jiǎn)單

首先考慮了apache/bin目錄下自帶的一個(gè)輪循工具:rotatelogs這個(gè)工具基本是用來(lái)按時(shí)間或按大小控制日志的,無(wú)法控制何時(shí)截斷和如何按天歸檔。
然后考慮logrotate后臺服務(wù):logrotate是一個(gè)專(zhuān)門(mén)對各種系統日志(syslogd,mail)進(jìn)行輪循的后臺服務(wù),比如SYSTEMLOG,但其配置比較復雜,放棄,實(shí)際上它也是對相應服務(wù)進(jìn)程發(fā)出一個(gè)-HUP重啟命令來(lái)實(shí)現日志的截斷歸檔的。

在apache的FAQ中,推薦了經(jīng)過(guò)近2年發(fā)展已經(jīng)比較成熟的一個(gè)工具cronolog:安裝很簡(jiǎn)單:configure=>make=>make install

他的一個(gè)配置的例子會(huì )讓你了解它有多么適合日志按天輪循:對httpd.conf做一個(gè)很小的修改就能實(shí)現:
TransferLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/access.log"
ErrorLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/errors.log"

然后:日志將寫(xiě)入
/web/logs/2002/12/31/access.log
/web/logs/2002/12/31/errors.log
午夜過(guò)后:日志將寫(xiě)入
/web/logs/2003/01/01/access.log
/web/logs/2003/01/01/errors.log
而2003 2003/01 和 2003/01/01 如果不存在的話(huà),將自動(dòng)創(chuàng )建

所以,只要你不在0點(diǎn)調整系統時(shí)間之類(lèi)的話(huà),日志應該是完全按天存放的(00:00:00-23:59:59),后面日志分析中:[31/Mar/2002:15:44:59這個(gè)字段就和日期無(wú)關(guān)了,只和時(shí)間有關(guān)。

測試:考慮到系統硬盤(pán)容量,決定按星期輪循日志
apache配置中加入:
#%w weekday
TransferLog "|/usr/sbin/cronolog /path/to/apache/logs/%w/access_log"

重啟apache后,除了原來(lái)的CustomLog/path/to/apche/logs/access_log繼續增長(cháng)外,系統log目錄下新建立了3/目錄(測試是在周3),過(guò)了一會(huì )兒,我忽然發(fā)現2個(gè)日志的增長(cháng)速度居然不一樣!
分別tail了2個(gè)日志才發(fā)現:
我設置CustomLog使用的是combined格式,就是包含(擴展信息的),而TransferLog使用的是缺省日志格式,看了apache的手冊才知道,TransferLog是用配置文件中離它自己最近的一個(gè)格式作為日志格式的。我的httpd.conf里寫(xiě)的是:
LogFormat ..... combined
LogFormat ... common
...
CustomLog ... combined
TransferLog ...

所以TrasferLog日志用的是缺省格式,手冊里說(shuō)要讓TRANSFER日志使用指定的格式需要:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\""
TransferLog "|/usr/local/sbin/cronolog/path/to/apache/logs/%w/access_log"

重啟,OK,日志格式一樣了。
這樣的設置結果其實(shí)是同時(shí)在logs目錄下分別記錄2個(gè)日志access_log和%w/access_log,能不能只記錄%w/下的日志那?
查apache手冊,更簡(jiǎn)單的方法:直接讓CustomLog輸出到cronolog歸檔日志,并且還能指定格式。
CustomLog "|/usr/local/sbin/cronolog/path/to/apache/logs/%w/access_log" combined

最后是一個(gè)日志同步的問(wèn)題。

任務(wù):每天凌晨找到前1天的日志,另存一個(gè)文件準備發(fā)送到服務(wù)器上。
比如我要保留前1周的日志:每天復制前1天的日志到指定目錄,等待日志服務(wù)器來(lái)抓?。?br>/bin/cp -f /path/to/apache/logs/`date -v-1d +%w`/access_log/path/for/backup/logs/access_log_yesterday

在FREEBSD上使用以下命令
date -v-1d +%w
注釋?zhuān)?br>-v-1d: 前1天,而在GNU/Linux上這個(gè)選項應該是date -d yesterday
+%w: weekday,由于使用的都是標準時(shí)間函數庫,所有工具中的WEEKDAY定義都是一樣的 0-6 => 周日-周六

注意:
寫(xiě)到CRONTAB里的時(shí)候"%"前面需要加一個(gè)"\"轉義:每天0點(diǎn)5分進(jìn)行一次日志歸檔,
另外一個(gè)問(wèn)題就是在cront中需要用:rm -f {} ; 而不是rm -f {}\;
5 0 * * * /bin/cp /path/to/logs/`date -v-1d +\%w`/access_log/path/to/for_sync/logs/access_yesterday
37 10 * * * /usr/bin/find /home/apache/logs/ -name access_log -mtime +1-exec /bin/rm -f {} ;

首次開(kāi)始cronolog日志統計是周3,一周以后日志又將輪循回3/access_log
但這次日志是追加到3/access_log還是重新創(chuàng )建一個(gè)文件呢?>>access_log or >access_log?
我測試的結果是日志將被追加:
[01/Apr/2002:23:59:59 +0800]
[01/Apr/2002:23:59:59 +0800]
[08/Apr/2002:00:00:00 +0800]
[08/Apr/2002:00:00:00 +0800]

肯定是不希望每次日志還帶著(zhù)上周的數據的并重復統計一次的(雖然對結果沒(méi)影響),而且這樣%w/下的日志不是也越來(lái)越多了嗎?
解決方法1 把每天的cp改成mv
解決方法2 每天復制完成后:刪除6天以前的access_log日志
find /path/to/apache/logs -name access_log -mtime +6 -exec rm -f {}\;
多保留幾天的日志還是有必要的:萬(wàn)一日志分析服務(wù)器壞了一天呢?

以下是把apache安裝在/home/apache下每天統計的一個(gè)腳本文件:
#!/bin/sh

#backup old log
/bin/cp -f /home/apache/logs/`date -d yesterday +%w`/access_log/home/apache/logs/access_log_yesterday

#remove old log
/usr/bin/find /home/apache/logs -name access_log -mtime +6 -exec rm -f{}\;

#analysis with webalizer
/usr/local/sbin/webalizer

總結:
1 用 cronolog 干凈,安全地輪循日志
2 用 sort -m 排序合并多個(gè)日志


參考資料:

日志分析統計工具:
http://directory.google.com/Top/Computers/Software/Internet/Site_Management/Log_Analysis/

Apche的日志設置:
http://httpd.apache.org/docs/mod/mod_log_config.html

Apache的日志輪循:
http://httpd.apache.org/docs/misc/FAQ.html#rotate

Cronolog
http://www.cronolog.org

Webalizer
http://www.mrunix.net/webalizer/
Webalzer的Windows版
http://www.medasys-lille.com/webalizer/

AWStats的使用簡(jiǎn)介
http://www.chedong.com/tech/awstats.html

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
apache的日志配置 - 風(fēng)吟的日志 - 網(wǎng)易博客
安裝cronolog,格式化Apache的日志文件
web服務(wù)器日志統計分析完全解決方案
使用Cronolog按日期時(shí)間分割apache日志文件
使用Fluentd+MongoDB采集Apache日志
tomcat catalina.out日志按日切割
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久