日志收集十大技術細節

本文探討在大規模日志數據收集過程中,針對日志文件的處理需要注意的技術細節。

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

大多數場景下,日志往往被分散在不同的目錄中,比如以日期為名的目錄。因此,工具必需支持對目錄的遞歸搜索和某種模式匹配。

POSIX標準定義了一組用于通配的特殊符號(Pattern Matching Notation):

  • *:匹配一個或多個字符
  • ?:匹配一個字符
  • []:匹配一個在范圍內的字符
  • [!]:匹配一個不在范圍內的字符

shell中很多常見命令都可以應用這種模式匹配規則,比如:

find / -name "*.so"

作為日志收集工具,也需要能夠做到這種匹配,從而對日志進行初步篩選。在Unix系統中,可以使用fnmatch函數實現。

2. 熱日志分析

日志的其中一個特點是:往往同時只有少數的日志文件正在寫入,大部分日志文件都不是正在寫入狀態。那么在收集日志的時候,為了降低資源的消耗,需要有一種機制來判斷哪些是“熱更新”的日志,只對熱更新日志進行讀取。我們采用的方式是,如果在若干次采樣周期內,發現讀取文件都是EOF,那么認為這個文件屬于冷日志,并將其剔除出熱日志隊列,并加入一個新的日志文件作為熱日志文件,循環往復。這樣,大多數情況下,即保證了實時性,又降低了資源的無效損耗。

3. 新文件檢測

對于采集一個目錄下的文件這種需求,必需要考慮到新文件增加的情況。通常設置一個間隔時間(比如2s),對目錄進行一個遍歷,然后對比當前已經被納管的文件,看是不是新文件。如果是新文件,應立刻加入到熱文件隊列,因為新的文件往往會立刻被寫入數據。這里采用hashmap能提高對比性能。

4. 采集點保存

程序總會因為某種原因退出,但是采集任務往往并沒有結束,這個時候,程序就需要有能力記錄下一些信息,以便下一次繼續從結束的點開始工作,以防止重復采集。針對每個文件,記錄當前讀取到的offset,并在程序退出時,及時刷寫進磁盤。

5. log rotate的探測

log rotate是常用的一種日志策略。當達到rotate的條件時,當前正在寫入的文件會重命名,并且不再寫入數據;然后創建一個新的文件來繼續寫入。當文件數量超過一定量時,將最早產生的文件刪除,這樣能防止日志無限制暴漲造成文件系統空間浪費。

基于log rotate的特點(會產生重命名文件的情況),日志工具可以通過記錄并對比inode來判斷文件是否是重命名的。

log rotate

6. 歸檔模式采集

遍歷和watch一個擁有百萬級文件個數的目錄,是件十分浪費資源的事情。因為,實際情況下,這種目錄的數據都是歷史數據,而且不會發生變化。因此,日志工具應當能夠支持我們稱為歸檔模式的工作模式,這種模式下,遍歷和watch目錄將采用極低的頻次,這樣不會浪費資源。

7. 文件狀態異常

文件狀態異常是指下列可能的情況:

  • 讀取文件的權限發生變化
  • 讀取文件時發生某種錯誤

程序應避免對這種文件“一刀切”,因為可能過一段時間文件又變成正常狀態了。所以,應當定期把有問題的文件再嘗試讀取,這樣不會遺漏。

8. 字符集的探測和轉化

在一些老的系統中,日志的編碼格式依舊會采用本地編碼。典型的是GBK編碼的日志。在日志上報的過程中,應采用統一的編碼格式。幾乎所有的系統都支持libiconv庫,這是一個可進行編碼轉化的常用庫。

9. 多行合并

日志數據由應用程序生成,?許多應用程序在寫入日志的時候,一條邏輯日志包含多行。比如下面的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)

從日志收集程序的角度,這里有很多行,但是,此時如果按行來分割是完全不行的。因此,應當提供一種可以合并多行日志為一行日志的能力。注意到這個日志以一個時間為開始(通常都是這樣),那么我們就可以設置一個正則匹配規則,匹配到就認為是一個邏輯日志行的開始:

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

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

10. Follow Symbolic Link

采集器能夠支持一個開關,用于設置是否對鏈接進行跟蹤,即讀取鏈接實際指向的文件或目錄。

其實,此外還有很多亮點功能值得探討,比如:

  • 對歷史的歸檔日志(tar包),直接讀取歸檔壓縮文件,從而避免先解壓再讀取的麻煩。
  • 在通配模式下,排除(exclude)或包含(include)某些特殊日志
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容