Develop with pleasure!

福岡でCloudとかBlockchainとか。

fluentd + mongoDBな環境構築

ログの管理をfluentdを使ってやってみようと環境構築。

mongoDBのインストール

まずはmongoDBをインストール。ローカルの環境がUbuntuなのでaptのソースリスト(/etc/apt/sources.list)にmongoDBの下記URLを追加する。

## mongoDB
deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen

続いて以下のコマンドでmongoDBをインストール。

$ sudo apt-get update
$ sudo apt-get mongodb-10gen

ちなみにmongodb-10genが最新の安定版でmongodb18-10genが前のバージョンらしい。(何でこんな別れ方してるんだ?)
mongoDBの起動・停止は以下のコマンドで可能。

# 起動
$ sudo service mongodb start
# 停止
$ sodo service mongodb stop

正常にmongoDBが起動していれば↓な反応が帰ってくる。

$ mongo
MongoDB shell version: 2.0.6
connecting to: test
> show dbs;
local	(empty)

fluentdのインストール

fluentdについては、いろいろインストール方法があるみたいだけど、今回はgemでインストール。ちなみにbsonはbinary jsonで、mongodbが内部でjsonデータを保存する際にbsonで管理してるらしい。

$ gem install fluentd
$ gem install fluent-plugin-mongo
$ gem install bson_ext

インストールが正常に終わればfluentdコマンド(ログの収集及び出力を行うデーモン)にパスが通った状態になる。またfluent-catというfluentdに対してtcpでログを送信するコマンド、fluent専用のgemを管理するfluent-gemというコマンドも利用可能になる。fluent-gemは、内部でgem_runnnerをコールしてて、fluentのgem環境にgemで提供されるfluentのPlugin等をインストール&メンテナンスできるように用意されてるみたい。

続いて、以下のコマンドでfluentdの設定ファイルのテンプレートを生成する。

$ fluentd --setup ./fluent

fluentディレクトリ直下にfluent.confという設定ファイルが生成される。↓のコマンドでこの設定ファイルを指定してfluentdが起動する。

$ fluentd -c ./fluent.conf -vv 

fluent.confの設定

mongoDBと連携するようfluent.confを設定する。

# インプットとなるログの場所を定義
<source>
  # forwardの場合はTCPソケットでログのイベントストリームを受信する。主にfluent-catや他のfluentのclientライブラリからログを受け取る際に使われる。
  type forward
</source>

# ログの出力先を定義
<match app.**>
  # 出力先としてmongoDBを使用
  type mongo
  # mongoDBのホスト
  host localhost
  # mongoDBのDB名
  database fluent
  # コレクションを定義
  collection sample
</match>

fluent-logger-javaでログ出力

Javaでfluentに対してログを出力したい場合、fluent/fluent-logger-java · GitHubというclientライブラリがある。

使い方は至ってシンプルで

FluentLogger log = FluentLogger.getLogger("app", "localhost", 24224);
log.log("label", "key", "value");

といったコードでfluentに対してログが発行される。mongoDBのデータを見てみると

$ mongo
connecting to: test
> use fluent;
switched to db fluent
> db.sample.find();
{ "_id" : ObjectId("5021f68ec3441a73f7000001"), "key" : "value", "time" : ISODate("2012-08-08T05:17:13Z") }

ログデータが格納されてることが確認できる。