fluentdはログ収集ミドルウェアで非同期通信/データストリームでログを収集します。
input/filter/outputというシンプルな構造となっていてrsyslogなど既存のログツールと協調姿勢を取っているのが良いなと思います。
基本的にRubyで書かれていて、性能が要求されるイベントループ部分はcool.io、シリアライズ実装はmsgpackを使っています。
また,fluentdをRubyからgolangに移植するプロジェクトがあるようです。
td-agentをインストールする
今回は Go で td-agent にログ送信します。環境は Ubuntu14.04, Go は1.2.1です。
$ curl -L https://toolbelt.treasure-data.com/sh/install-ubuntu-precise.sh | sh
$ which td-agent
/usr/sbin/td-agent
$ /etc/init.d/td-agent start
サービスを確認します。
$ sudo lsof -i:8888
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ruby 1090 td-agent 9u IPv4 10613 0t0 TCP *:8888 (LISTEN)
$ sudo lsof -i:24224
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ruby 7364 td-agent 7u IPv4 28668 0t0 TCP *:24224 (LISTEN)
ruby 7364 td-agent 8u IPv4 28669 0t0 UDP *:24224
td-agentの設定
td-agent.confを以下のように設定します。
sourceディレクティブはログの収集方法(Input)の定義、matchは条件にマッチしたログの処理方法(Output)を定義します。
(include他の設定ファイルを読み込む)
$ sudo vim /etc/td-agent/td-agent.conf
<source>
type http
port 8888
</source>
## live debugging agent
<source>
type debug_agent
bind 127.0.0.1
port 24230
</source>
$ /etc/init.d/td-agent restart
ついでに、Linux起動時にdeamonとして動かす設定にしました。
# case : debian
$ sudo apt-get install sysv-rc-conf
$ sudo sysv-rc-conf td-agent on
$ sudo sysv-rc-conf --list | grep td-agent
td-agent 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# case : RHEL
$ sudo chkconfig td-agent on
curlでログ送信
試しにcurlでログを送信します。
$ curl -X POST -d 'json={"json":"message"}' https://localhost:8888/debug.test
td-agent.logを確認します。
$ sudo tail /var/log/td-agent/td-agent.log
2014-08-24 15:20:54 +0900 debug.test: {"json":"message"}
golangでログ送信する
fluent-logger-golangを使います。
$ go get -u github.com/t-k/fluent-logger-golang/fluent
fluent.New(fluent.Config{})でfluentインスタンスを作って、[ tag, time(unix) , data(key-value) ] を指定しPostWithTimeで送信します。
package main
import (
"fmt"
"github.com/t-k/fluent-logger-golang/fluent"
"time"
)
func main() {
logger, err := fluent.New(fluent.Config{FluentPort: 24224, FluentHost: "127.0.0.1"})
if err != nil {
fmt.Println(err)
}
defer logger.Close()
tag := "debug.test"
t := time.Now()
data := map[string]string{"message": "hello"}
logger.PostWithTime(tag, t, data)
}
確認します。
$ sudo tail /var/log/td-agent/td-agent.log
2014-08-24 00:51:25 +0900 debug.test: {"message":"hello"}