Menu

使用 Fluentd + MongoDB 構建即時日誌收集系統

http://cl.ly/QDWQ/fluentd.png

fluentd是一個日誌收集系統,它的特點在於其各部分均是可定製化的,你可以通過簡單的配置,將日誌收集到不同的地方。

目前開源社區已經貢獻了下面一些存儲外掛:MongoDBRedisCouchDB,Amazon S3Amazon SQSScribe0MQAMQPDelayedGrowl 等等。

本文要介紹的是在Fluentd的最新版中已經內置的MongoDB支持。主要通過一個收集Apache日誌的例子來說明其使用方法:

機製圖解

tumblr_lvpwxvhWvL1r2sums

安裝

為了完成相關的測試,需要安裝下面一些組件:

  • Fluentd with MongoDB Plugin
  • MongoDB
  • Apache (with the Combined Log Format)

在Fluentd的最新安裝包中已經包含了MongoDB插件,你也可以用命令

gem install fluent-plugin-mongo

來進行安裝

配置

如果你是使用上面的deb/rpm包安裝的Fluentd,那麼配置文件位置在:/etc/td-agent/td-agent.conf,否則其位置應該在:/etc/fluentd/fluentd.conf

首先我們編輯配置文件中的source來設置日誌來源

<source>
  type tail
  format apache
  path /var/log/apache2/access_log
  tag mongo.apache
</source>

其中:

  1. type tail: tail方式是 Fluentd 內置的輸入方式,其原理是不停地從源文件中獲取新的日誌。
  2. format apache: 指定使用 Fluentd 內置的 Apache 日誌解析器。
  3. path /var/log/apache2/access_log: 指定日誌文件位置。
  4. tag mongo.apache: 指定tag,tag被用來對不同的日誌進行分類

下面再來編輯輸出配置,配置日誌收集後存儲到MongoDB中

<match mongo.**>
  # plugin type
  type mongo
  # mongodb db + collection
  database apache
  collection access
  # mongodb host + port
  host localhost
  port 27017
  # interval
  flush_interval 10s
</match>

match標籤後面可以跟正則表達式以匹配我們指定的tag,只有匹配成功的tag對應的日誌才會運用裡面的配置。配置中的其它項都比較好理解,看註釋就可以了,其中flush_interval是用來控制多長時間將日誌寫入MongoDB一次。

測試

用ab工具對Apache進行訪問,以產生相應的訪問日誌以供收集

$ ab -n 100 -c 10 http://localhost/>

然後我們在MongoDB中就能看到收集到的日誌了

$ mongo
> use apache
> db.access.find()
{ "_id" : ObjectId("4ed1ed3a340765ce73000001"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "200", "size" : "44", "time" : ISODate("2011-11-27T07:56:27Z") }
{ "_id" : ObjectId("4ed1ed3a340765ce73000002"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "200", "size" : "44", "time" : ISODate("2011-11-27T07:56:34Z") }
{ "_id" : ObjectId("4ed1ed3a340765ce73000003"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "200", "size" : "44", "time" : ISODate("2011-11-27T07:56:34Z") }