亚洲一区亚洲二区亚洲三区,国产成人高清在线,久久久精品成人免费看,999久久久免费精品国产牛牛,青草视频在线观看完整版,狠狠夜色午夜久久综合热91,日韩精品视频在线免费观看

多服務(wù)器的日志合并統(tǒng)計(jì) -電腦資料

電腦資料 時(shí)間:2019-01-01 我要投稿
【www.ishadingyu.com - 電腦資料】

    作者:snail

    內(nèi)容摘要:你完全不必耐心地看完下面的所有內(nèi)容,因?yàn)榻Y(jié)論無非以下2點(diǎn):

    1 用 cronolog 干凈,安全地輪循apache“日”志

    2 用 sort -m 合并排序多個(gè)日志

    根據(jù)個(gè)人的使用經(jīng)歷:

    1 先介紹apache日志的合并方法;

    2 然后根據(jù)由此引出的問題說明日志輪循的必要性和解決方法,介紹如何通過cronolog對(duì)apache日志進(jìn)行輪循;

    中間有很多在設(shè)計(jì)日志合并過程中一些相關(guān)工具的使用技巧和一些嘗試的失敗經(jīng)歷……

    我相信解決以上問題的路徑不止這一條途徑,以下方案肯定不是最簡便或者說成本最低的,希望能和大家有更多的交流,

多服務(wù)器的日志合并統(tǒng)計(jì)

。

    {0} 多服務(wù)器日志合并統(tǒng)計(jì)的必要性:

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

    統(tǒng)一日志統(tǒng)計(jì)所帶來的好處是顯而易見的,但如何把所有機(jī)器的統(tǒng)計(jì)合并到一個(gè)統(tǒng)計(jì)結(jié)果里呢?

    首先也許會(huì)想:多個(gè)服務(wù)器能不能將日志記錄到同一個(gè)遠(yuǎn)程文件里呢?我們不考慮使用遠(yuǎn)程文件系統(tǒng)記錄日志的問題,因?yàn)閹淼穆闊┻h(yuǎn)比你獲得的方便多的多……

    因此,要統(tǒng)計(jì)的多個(gè)服務(wù)器的日志還是:分別記錄=>并通過一定方式定期同步到后臺(tái)=>合并=>后用日志分析工具來進(jìn)行分析。

    首先,要說明為什么要合并日志:因?yàn)閣ebalizer沒有將同一天的多個(gè)日志合并的功能

    先后運(yùn)行

    webalizer log1

    webalizer log2

    webalizer log3

    這樣最后的結(jié)果是:只有l(wèi)og3的結(jié)果。

    能不能將log1<

    因?yàn)橐粋(gè)日志的分析工具不是將日志一次全部讀取后進(jìn)行分析,而且流式的讀取日志并按一定時(shí)間間隔,保存階段性的統(tǒng)計(jì)結(jié)果。因此時(shí)間跨度過大(比如2條日志間隔超過5分鐘),一些日志統(tǒng)計(jì)工具的算法就會(huì)將前面的結(jié)果“忘掉”。因此, log1<

    {1} 日志合并問題

    多個(gè)服務(wù)的合并統(tǒng)計(jì)就是要把日志按時(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è)日志的交叉合并。合并后的日志應(yīng)該是:

    00:15:00 來自log1

    00:15:00 來自log2

    00:16:00 來自log1

    00:17:00 來自log3

    00:18:00 來自log2

    00:19:00 來自log1

    ....

    如何合并多個(gè)日志文件?

    下面以標(biāo)準(zhǔn)的clf格式日志(apache)為例:

    apche的日志格式是這樣的:

    %h %l %u %t "%r" %>s %b

    具體的例子:

    111.222.111.222 - - [03/Apr/2002:10:30:17 +0800]

    "GET / HTTP/1.1" 200 419

    最簡單的想法是將日志一一讀出來,然后按日志中的時(shí)間字段排序

    cat log1 log2 log3 |sort -k 4 -t " "

    注釋:

    -t " ": 日志字段分割符號(hào)是空格

    -k 4: 按第4個(gè)字段排序,也就是:

    [03/Apr/2002:10:30:17 +0800] 這個(gè)字段

    -o log_all: 輸出到log_all這個(gè)文件中

    但這樣的效率比較低,要知道。如果一個(gè)服務(wù)已經(jīng)需要使用負(fù)載均衡,其服務(wù)的單機(jī)日志條數(shù)往往都超過了千萬級(jí),大小在幾百M(fèi),這樣要同時(shí)對(duì)多個(gè)幾百M(fèi)的日志進(jìn)行排序,機(jī)器的負(fù)載可想而之……

    其實(shí)有一個(gè)優(yōu)化的途徑,要知道:即使單個(gè)日志本身已經(jīng)是一個(gè)“已經(jīng)按照時(shí)間排好序“的文件了,而sort對(duì)于這種文件的排序合并提供了一個(gè)優(yōu)化合并算法:使用 -m merge合并選項(xiàng),

    因此:合并這樣格式的3個(gè)日志文件log1 log2 log3并輸出到log_all中比較好方法是:

    sort -m -t " " -k 4 -o log_all log1 log2 log3

    注釋:

    -m: 使用 merge優(yōu)化算法

    注意:合并后的日志輸出最好壓縮以后再發(fā)給webalizer處理

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

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

    {2} 日志的輪循機(jī)制:

    讓我們關(guān)心一下數(shù)據(jù)源問題:webalizer其實(shí)是一個(gè)按月統(tǒng)計(jì)的工具,支持增量統(tǒng)計(jì):因此對(duì)于大型的服務(wù),我可以按天將apache的日志合并后送給webalizer統(tǒng)計(jì)。WEB日志是如何按天(比如每天子夜00:00:00)截?cái)嗄兀?/p>

    如果你每天使用crontab:每天0點(diǎn)準(zhǔn)時(shí)將日志備份成accesserials_log_yesterday

    mv /path/to/apache/log/accesserials_log

    /path/to/apache/log/accesserials_log_yesterday

    的話:你還需要:馬上運(yùn)行一下:apache restart 否則:apache會(huì)因?yàn)榈娜罩疚募浔鷣G失不知道將日志記錄到哪里去了。這樣歸檔每天子夜重啟apache服務(wù)會(huì)受到影響。

    比較簡便不影響服務(wù)的方法是:先復(fù)制,后清空

    cp /path/to/apache/log/accesserials_log /path/to/apache/log/accesserials_log_yesterday

    echo >/path/to/apache/log/accesserials_log

    嚴(yán)肅的分析員會(huì)這樣做發(fā)現(xiàn)一個(gè)問題:

    但cp不可能嚴(yán)格保證嚴(yán)格的0點(diǎn)截?cái)。加入?fù)制過程用了6秒,截?cái)嗟腶ccesserials_log_yesterday日志中會(huì)出現(xiàn)復(fù)制過程到00:00:06期間的日志。對(duì)于單個(gè)日志統(tǒng)計(jì)這些每天多出來幾百行日志是沒有問題的。但對(duì)于多個(gè)日志在跨月的1天會(huì)有一個(gè)合并的排序問題:

    [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)行“跨天排序”的。因?yàn)槿掌谥惺褂昧薲d/mm/yyyy,月份還是英文名,如果按照字母排序,很有可能是這樣的結(jié)果:排序?qū)е铝巳罩镜腻e(cuò)誤

    [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ù)對(duì)于webalizer等分析工具來說簡直就好像是吃了一個(gè)臭蟲一樣,運(yùn)行的結(jié)果是:它可能會(huì)把前一個(gè)月所有的數(shù)據(jù)都丟失!因此這樣的數(shù)據(jù)會(huì)有很多風(fēng)險(xiǎn)出現(xiàn)在處理上月最后一天的數(shù)據(jù)的過程中。

    問題的解決有幾個(gè)思路:

    1 事后處理:

    所以一個(gè)事后的處理的方法是:用grep命令在每月第1天將日志跨月的日志去掉,比如:

    grep -v "01/Apr" accesserials_log_04_01 > accesserials_log_new

    修改SORT后的日志:所有跨天的數(shù)據(jù)去掉,

電腦資料

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

    2 優(yōu)化數(shù)據(jù)源:

    最好的辦法還是優(yōu)化數(shù)據(jù)源。將數(shù)據(jù)源保證按天輪循,同一天的日志中的數(shù)據(jù)都在同一天內(nèi)。這樣以后你無論使用什么工具(商業(yè)的,免費(fèi)的)來分析日志,都不會(huì)因?yàn)槿罩緩?fù)雜的預(yù)處理機(jī)制受到影響。

    首先可能會(huì)想到的是控制截取日志的時(shí)間:比如嚴(yán)格從0點(diǎn)開始截取日志,但在子夜前1分鐘還是后一分鐘開始截取是沒有區(qū)別的,你仍然無法控制一個(gè)日志中有跨2天記錄的問題,而且你也無法預(yù)測(cè)日志歸檔過程使用的時(shí)間。

    因此必須要好好考慮一下使用日志輪循工具的問題,這些日志輪循工具要符合:

    1 不中斷WEB服務(wù):不能停apache=>移動(dòng)日志=>重啟apache

    2 保證同一天日志能夠按天輪循:每天一個(gè)日志00:00:00-23:59:59

    3 不受apache重啟的影響:如果apache每次重啟都會(huì)生成一個(gè)新的日志是不符合要求的

    4 安裝配置簡單

    首先考慮了apache/bin目錄下自帶的一個(gè)輪循工具:rotatelogs 這個(gè)工具基本是用來按時(shí)間或按大小控制日志的,無法控制何時(shí)截?cái)嗪腿绾伟刺鞖w檔。

    然后考慮logrotate后臺(tái)服務(wù):logrotate是一個(gè)專門對(duì)各種系統(tǒng)日志(syslogd,mail)進(jìn)行輪循的后臺(tái)服務(wù),比如SYSTEM LOG,但其配置比較復(fù)雜,放棄,實(shí)際上它也是對(duì)相應(yīng)服務(wù)進(jìn)程發(fā)出一個(gè)-HUP重啟命令來實(shí)現(xiàn)日志的截?cái)鄽w檔的。

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

    configure=>make=> make install

    他的一個(gè)配置的例子會(huì)讓你了解它有多么適合日志按天輪循:對(duì)httpd.conf做一個(gè)很小的修改就能實(shí)現(xiàn):

    TransferLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/access.log"

    ErrorLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/errors.log"

    然后:日志將寫入

    /web/logs/2002/12/31/access.log

    /web/logs/2002/12/31/errors.log

    午夜過后:日志將寫入

    /web/logs/2003/01/01/access.log

    /web/logs/2003/01/01/errors.log

    而2003 2003/01 和 2003/01/01 如果不存在的話,將自動(dòng)創(chuàng)建

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

    測(cè)試:考慮到系統(tǒng)硬盤容量,決定按星期輪循日志

    apache配置中加入:

    #%w weekday

    TransferLog "|/usr/sbin/cronolog /path/to/apache/logs/%w/accesserials_log"

    重啟apache后,除了原來的CustomLog /path/to/apche/logs/accesserials_log繼續(xù)增長外,系統(tǒng)log目錄下新建立了 3/目錄(測(cè)試是在周3),過了一會(huì)兒,我忽然發(fā)現(xiàn)2個(gè)日志的增長速度居然不一樣!

    分別tail了2個(gè)日志才發(fā)現(xiàn):

    我設(shè)置CustomLog使用的是combined格式,就是包含(擴(kuò)展信息的),而TransferLog使用的是缺省日志格式,看了apache的手冊(cè)才知道,TransferLog是用配置文件中離它自己最近的一個(gè)格式作為日志格式的。我的httpd.conf里寫的是:

    LogFormat ..... combined

    LogFormat ... common

    ...

    CustomLog ... combined

    TransferLog ...

    所以TrasferLog日志用的是缺省格式,手冊(cè)里說要讓TRANSFER日志使用指定的格式需要:

    LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i""

    TransferLog "|/usr/local/sbin/cronolog /path/to/apache/logs/%w/accesserials_log"

    重啟,OK,日志格式一樣了。

    這樣的設(shè)置結(jié)果其實(shí)是同時(shí)在logs目錄下分別記錄2個(gè)日志accesserials_log和%w/accesserials_log,能不能只記錄%w/下的日志那?

    查apache手冊(cè),更簡單的方法:直接讓CustomLog輸出到cronolog歸檔日志,并且還能指定格式。

    CustomLog "|/usr/local/sbin/cronolog

    /path/to/apache/logs/%w/accesserials_log" combined

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

    任務(wù):每天凌晨找到前1天的日志,另存一個(gè)文件準(zhǔn)備發(fā)送到服務(wù)器上。

    比如我要保留前1周的日志:每天復(fù)制前1天的日志到指定目錄,等待日志服務(wù)器來抓。

    /bin/cp /path/to/logs/`date -v-1d +%w`/accesserials_log

    /path/to/sync/logs/accesserials_yesterday

    在FREEBSD上使用以下命令

    date -v-1d +%w

    注釋:

    -v-1d: 前1天,而在LINUX上這個(gè)選項(xiàng)應(yīng)該是date -d yesterday

    +%w: weekday,由于使用的都是標(biāo)準(zhǔn)時(shí)間函數(shù)庫,所有工具中的WEEKDAY定義都是一樣的 0-6 => 周日-周六

    注意:寫到CRONTAB里的時(shí)候"%"前面需要加一個(gè)""轉(zhuǎn)義:每天0點(diǎn)5分進(jìn)行一次日志歸檔

    5 0 * * * /bin/cp /path/to/logs/`date -v-1d +%w`/accesserials_log

    /path/to/for_sync/logs/accesserials_yesterday

    首次開始cronolog日志統(tǒng)計(jì)是周3,一周以后日志又將輪循回3/accesserials_log

    但這次日志是追加到3/accesserials_log還是重新創(chuàng)建一個(gè)文件呢?>>accesserials_log or >accesserials_log?

    我測(cè)試的結(jié)果是日志將被追加:

    [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]

    肯定是不希望每次日志還帶著上周的數(shù)據(jù)的并重復(fù)統(tǒng)計(jì)一次的(雖然對(duì)結(jié)果沒影響),而且這樣%w/下的日志不是也越來越多了嗎?

    解決方法1 把每天的cp改成mv

    解決方法2 每天復(fù)制完成后:刪除6天以前的accesserials_log日志

    find /path/to/apache/logs -name accesserials_log -mtime +6 -exec rm -f {};

    多保留幾天的日志還是有必要的:萬一日志分析服務(wù)器壞了一天呢?

    總結(jié)

    1 用 cronolog 干凈,安全地輪循日志

    2 用 sort -m 排序合并多個(gè)日志

    參考資料:

    日志分析統(tǒng)計(jì)工具:

    http://directory.google.com/Top/Computers/Software/

    Internet/Site_Management/Log_Analysis/

    Apche的日志設(shè)置:

    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

最新文章