標籤:

kids:知乎日誌系統

很久很久以前,為了做anti-spam系統,我們希望有個系統可以很方便的實時訂閱應用的日誌。於是,我們決定先做一個日誌系統。這個系統要滿足:

  1. 分散式收集
  2. 集中存儲
  3. 實時訂閱
  4. 不丟(或者盡量不丟)
  5. 對應用性能影響盡量小

當然,在這之前,我們考察了一些項目,如scribe,但是這個貨依賴thrift,且沒有實時訂閱功能,另外對scribe的xml風格的配置文件表示難以理解:-(。redis有發布/訂閱功能,但是沒有存儲。其他諸如kafka,flume等項目基本都是基於java的,且較重,不合我們的口味。於是我們決定自己寫一個支持訂閱的scribe,同時實現scribe的分散式收集日誌,和redis的發布/訂閱功能。取名為kids,是Kids Is Data Stream的首字母縮寫。

先來看樣例配置文件。

對於匯聚節點來說,配置文件通常長成這樣:

ignore_case on;nnnlimit pubsub 32MB 16MB 10min;nnlog {n level info;n file /tmp/kids.log;n}nnlisten {n port 3388;n}nnstore priority {n store null {n topic stat.*; # ignore logs of these topicsn }n store file {n path /log/[topic];n name [date]-[time].log;n rotate 1hour;n }n}n

意思是:每個kids實例都要配置一個store,store有多種類型,比如file類型可以將日誌寫入磁碟,null類型就把日誌丟棄,network則會將日誌轉發給其他kids。priority類型則是依次找第一個滿足要求的store,然後寫入。store可以嵌套。

於是,上面的配置文件意思就很明確了,將stat.*這類topic的日誌全丟棄,其他日誌寫入磁碟,每小時一個文件。

對於每台機器上都要裝的搜集節點,配置文件通常長成這樣:

ignore_case on;nnnlimit pubsub 32MB 16MB 10min;nnlog {n level error;n file /tmp/kids.log;n}nnlisten {n socket /var/run/kids.sock;n}nnstore multiple {n success any;n# mastern store buffer {n store network primary {n host server1;n port 3388;n }n store file secondary {n path /tmp/kidsbuf;n rotate 10min;n }n }nn# backupn store buffer {n store network primary {n host server2;n port 3388;n }n store file secondary {n path /tmp/kidsbuf2;n rotate 10min;n }n }n}n

意思是,寫入兩個遠程節點中的任意一個,任何一個成功就可以。而寫遠程節點的時候又有備用的文件store,當遠程節點掛了的時候會暫時寫入文件,等恢復再導回去。

至於發布訂閱嘛。很簡單,kids的協議完全兼容redis協議,只要用redis的客戶端,直接subscribe或者psubscribe就可以了。

現在我們所有的日誌都已經記錄到這個系統中了。

嗯,就是這麼簡單。
推薦閱讀:

10分鐘搭建MySQL Binlog分析+可視化方案
mysql binlog日誌自動清理及手動刪除
kids 開源了!
Spring Boot中logback配置文件載入過程
您和您所在的開發團隊都是怎麼列印日誌的?又是怎麼使用日誌的?

TAG:日志 |