日志收集十大技術(shù)細(xì)節(jié)

本文探討在大規(guī)模日志數(shù)據(jù)收集過程中络它,針對(duì)日志文件的處理需要注意的技術(shù)細(xì)節(jié)斤寂。

1. 通配符和目錄遞歸搜索

大多數(shù)場(chǎng)景下仿贬,日志往往被分散在不同的目錄中,比如以日期為名的目錄坠韩。因此,工具必需支持對(duì)目錄的遞歸搜索和某種模式匹配炼列。

POSIX標(biāo)準(zhǔn)定義了一組用于通配的特殊符號(hào)(Pattern Matching Notation):

  • *:匹配一個(gè)或多個(gè)字符
  • ?:匹配一個(gè)字符
  • []:匹配一個(gè)在范圍內(nèi)的字符
  • [!]:匹配一個(gè)不在范圍內(nèi)的字符

shell中很多常見命令都可以應(yīng)用這種模式匹配規(guī)則只搁,比如:

find / -name "*.so"

作為日志收集工具,也需要能夠做到這種匹配唯鸭,從而對(duì)日志進(jìn)行初步篩選须蜗。在Unix系統(tǒng)中,可以使用fnmatch函數(shù)實(shí)現(xiàn)目溉。

2. 熱日志分析

日志的其中一個(gè)特點(diǎn)是:往往同時(shí)只有少數(shù)的日志文件正在寫入明肮,大部分日志文件都不是正在寫入狀態(tài)。那么在收集日志的時(shí)候缭付,為了降低資源的消耗柿估,需要有一種機(jī)制來判斷哪些是“熱更新”的日志,只對(duì)熱更新日志進(jìn)行讀取陷猫。我們采用的方式是秫舌,如果在若干次采樣周期內(nèi),發(fā)現(xiàn)讀取文件都是EOF绣檬,那么認(rèn)為這個(gè)文件屬于冷日志足陨,并將其剔除出熱日志隊(duì)列,并加入一個(gè)新的日志文件作為熱日志文件娇未,循環(huán)往復(fù)墨缘。這樣,大多數(shù)情況下,即保證了實(shí)時(shí)性镊讼,又降低了資源的無效損耗宽涌。

3. 新文件檢測(cè)

對(duì)于采集一個(gè)目錄下的文件這種需求,必需要考慮到新文件增加的情況蝶棋。通常設(shè)置一個(gè)間隔時(shí)間(比如2s)卸亮,對(duì)目錄進(jìn)行一個(gè)遍歷,然后對(duì)比當(dāng)前已經(jīng)被納管的文件玩裙,看是不是新文件兼贸。如果是新文件,應(yīng)立刻加入到熱文件隊(duì)列吃溅,因?yàn)樾碌奈募鶗?huì)立刻被寫入數(shù)據(jù)寝受。這里采用hashmap能提高對(duì)比性能。

4. 采集點(diǎn)保存

程序總會(huì)因?yàn)槟撤N原因退出罕偎,但是采集任務(wù)往往并沒有結(jié)束很澄,這個(gè)時(shí)候,程序就需要有能力記錄下一些信息颜及,以便下一次繼續(xù)從結(jié)束的點(diǎn)開始工作甩苛,以防止重復(fù)采集。針對(duì)每個(gè)文件俏站,記錄當(dāng)前讀取到的offset讯蒲,并在程序退出時(shí),及時(shí)刷寫進(jìn)磁盤肄扎。

5. log rotate的探測(cè)

log rotate是常用的一種日志策略墨林。當(dāng)達(dá)到rotate的條件時(shí),當(dāng)前正在寫入的文件會(huì)重命名犯祠,并且不再寫入數(shù)據(jù)旭等;然后創(chuàng)建一個(gè)新的文件來繼續(xù)寫入。當(dāng)文件數(shù)量超過一定量時(shí)衡载,將最早產(chǎn)生的文件刪除搔耕,這樣能防止日志無限制暴漲造成文件系統(tǒng)空間浪費(fèi)。

基于log rotate的特點(diǎn)(會(huì)產(chǎn)生重命名文件的情況)痰娱,日志工具可以通過記錄并對(duì)比inode來判斷文件是否是重命名的弃榨。

log rotate

6. 歸檔模式采集

遍歷和watch一個(gè)擁有百萬級(jí)文件個(gè)數(shù)的目錄,是件十分浪費(fèi)資源的事情梨睁。因?yàn)榫ňΓ瑢?shí)際情況下,這種目錄的數(shù)據(jù)都是歷史數(shù)據(jù)坡贺,而且不會(huì)發(fā)生變化官辈。因此划咐,日志工具應(yīng)當(dāng)能夠支持我們稱為歸檔模式的工作模式,這種模式下钧萍,遍歷和watch目錄將采用極低的頻次,這樣不會(huì)浪費(fèi)資源政鼠。

7. 文件狀態(tài)異常

文件狀態(tài)異常是指下列可能的情況:

  • 讀取文件的權(quán)限發(fā)生變化
  • 讀取文件時(shí)發(fā)生某種錯(cuò)誤

程序應(yīng)避免對(duì)這種文件“一刀切”风瘦,因?yàn)榭赡苓^一段時(shí)間文件又變成正常狀態(tài)了。所以公般,應(yīng)當(dāng)定期把有問題的文件再嘗試讀取万搔,這樣不會(huì)遺漏。

8. 字符集的探測(cè)和轉(zhuǎn)化

在一些老的系統(tǒng)中官帘,日志的編碼格式依舊會(huì)采用本地編碼瞬雹。典型的是GBK編碼的日志。在日志上報(bào)的過程中刽虹,應(yīng)采用統(tǒng)一的編碼格式酗捌。幾乎所有的系統(tǒng)都支持libiconv庫(kù),這是一個(gè)可進(jìn)行編碼轉(zhuǎn)化的常用庫(kù)涌哲。

9. 多行合并

日志數(shù)據(jù)由應(yīng)用程序生成胖缤,?許多應(yīng)用程序在寫入日志的時(shí)候,一條邏輯日志包含多行阀圾。比如下面的java異常日志哪廓,打印出了堆棧的信息:

11 五月 2016 11:35:52,602 ERROR java.lang.IllegalArgumentException: No bean specified
    at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:632)
    at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:715)
    at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:290)
    at lib.util.BeanUtil.getBeanProperty(BeanUtil.java:184)
    at lib.comm.services.CommWebService.getResponse(CommWebService.java:173)
    at lib.comm.services.CommWebService.SendSimplePack(CommWebService.java:307)
    at lib.comm.services.CommWebService.exchange(CommWebService.java:40)
    at lib.comm.CommunicationUtil.exchange(CommunicationUtil.java:46)
    at lib.comm.CommunicationUtil.exchangeFull(CommunicationUtil.java:105)
    at lib.helper.TradeHelper.tellerBasicInfoQuery(TradeHelper.java:1520)

從日志收集程序的角度,這里有很多行初烘,但是涡真,此時(shí)如果按行來分割是完全不行的。因此肾筐,應(yīng)當(dāng)提供一種可以合并多行日志為一行日志的能力哆料。注意到這個(gè)日志以一個(gè)時(shí)間為開始(通常都是這樣),那么我們就可以設(shè)置一個(gè)正則匹配規(guī)則吗铐,匹配到就認(rèn)為是一個(gè)邏輯日志行的開始:

/\d{2} \S+ \d{4} \d{2}:\d{2}:\d{2},\d{3}/

這樣收集上來的日志才便于處理和分析剧劝。通過靈活的設(shè)置正則,極大的降低了后端處理日志的難度抓歼。

10. Follow Symbolic Link

采集器能夠支持一個(gè)開關(guān)讥此,用于設(shè)置是否對(duì)鏈接進(jìn)行跟蹤,即讀取鏈接實(shí)際指向的文件或目錄谣妻。

其實(shí)萄喳,此外還有很多亮點(diǎn)功能值得探討,比如:

  • 對(duì)歷史的歸檔日志(tar包)蹋半,直接讀取歸檔壓縮文件他巨,從而避免先解壓再讀取的麻煩。
  • 在通配模式下,排除(exclude)或包含(include)某些特殊日志
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末染突,一起剝皮案震驚了整個(gè)濱河市捻爷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌份企,老刑警劉巖也榄,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異司志,居然都是意外死亡甜紫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門骂远,熙熙樓的掌柜王于貴愁眉苦臉地迎上來囚霸,“玉大人,你說我怎么就攤上這事激才⊥匦停” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵瘸恼,是天一觀的道長(zhǎng)吨述。 經(jīng)常有香客問我,道長(zhǎng)钞脂,這世上最難降的妖魔是什么揣云? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮冰啃,結(jié)果婚禮上邓夕,老公的妹妹穿的比我還像新娘。我一直安慰自己阎毅,他們只是感情好焚刚,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扇调,像睡著了一般矿咕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狼钮,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天碳柱,我揣著相機(jī)與錄音,去河邊找鬼熬芜。 笑死莲镣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涎拉。 我是一名探鬼主播瑞侮,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼的圆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了半火?” 一聲冷哼從身側(cè)響起越妈,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钮糖,沒想到半個(gè)月后梅掠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藐鹤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赂韵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娱节。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖祭示,靈堂內(nèi)的尸體忽然破棺而出肄满,到底是詐尸還是另有隱情,我是刑警寧澤质涛,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布稠歉,位于F島的核電站,受9級(jí)特大地震影響汇陆,放射性物質(zhì)發(fā)生泄漏怒炸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一毡代、第九天 我趴在偏房一處隱蔽的房頂上張望阅羹。 院中可真熱鬧,春花似錦教寂、人聲如沸捏鱼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)导梆。三九已至,卻和暖如春迂烁,著一層夾襖步出監(jiān)牢的瞬間看尼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工盟步, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狡忙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓址芯,卻偏偏與公主長(zhǎng)得像灾茁,于是被迫代替她去往敵國(guó)和親窜觉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容