【Fluentd】td-agent に Golang でログ送信してみる

fluentdはログ収集ミドルウェアで非同期通信/データストリームでログを収集します。
input/filter/outputというシンプルな構造となっていてrsyslogなど既存のログツールと協調姿勢を取っているのが良いなと思います。
基本的にRubyで書かれていて、性能が要求されるイベントループ部分はcool.io、シリアライズ実装はmsgpackを使っています。

fluentdphoto by fluentd.org

また,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"}