fluent-loggerを使ってfluentdにログを送ってみる

fluent-loggerを使ってfluentdにログを転送してみたメモです。


各言語から直接fluentdにログを送るのはどうするのか分からなかったので調べてみると、
fluentのGitHubリポジトリに各言語ごとのfluent-logger-xxxxがありました。

github.com


2018年2月時点では
java, python, ruby, go, node, php, perl, scala, erlang, D, ocaml
が存在しています。
fluentのリポジトリにない言語も有志で作っているものがあるようです(fluent-logger-haskellなど)

javaとgoで試してみようと思います。
ほとんどREADMEのままです。

下記のバージョンで試してみます。

  • Ubuntu 16.04
  • td-agent 0.12.4(fluentd-0.12.40)
  • Elasticsearch 6.1.1
  • Kibana 6.1.2
  • fluent-logger-java 0.3.3
  • fluent-logger-golang 1.3.0

fluentd(td-agent), elasticsearch, kibanaインストール

前回と同様の手順でtd-agent, elasticsearch, kibana, fluent-plugin-elasticsearch
をインストールします。

elasticsearch mapping

elasticsearchのmappingを定義します。
userというtypeで、下記のフィールドを定義。

  • name: text
  • age: integer
  • country: text
  • @timestamp: date

マッピングファイルを作成して、登録します。

$ vi user_mapping.json
{
  "template": "applog",
  "mappings": {
    "user": {
      "properties": {
        "name": {"type": "text"},
        "age": {"type": "integer"},
        "country": {"type": "text"},
        "@timestamp": {"type": "date", "index": "false"}
      }
    }
  }
}
$ curl -X PUT -H "Content-Type: application/json" 'http://localhost:9200/applog' -d @user_mapping.json

td-agent設定

td-agent.confに設定を記述します。

td-agent.conf

$ sudo vi /etc/td-agent/td-agent.conf
<source>
  @type forward
  @label @applog
  port 24224
</source>

<label @applog>
  <filter app.*>
    @type stdout
  </filter>
  <match app.*>
    @type elasticsearch
    host localhost
    port 9200

    index_name applog
    type_name user

    logstash_format true
    logstash_prefix applog
  </match>
</label>

fluentdをport:24224で待ち受けて、@applogというlabelを設定します。

app.*のtagのみフィルタプラグインで標準出力に出力した後、elasticsearchに出力します。

・logstash_format true
・logstash_prefix applog
を設定しているので、インデックス名がapplog-YYYY.MM.DDになります。
logstash_formatがtrueの場合、ログ取得時の時間が@timestampとして動的に生成されます。

fluent-logger-java

javaでfluentdにログを流してみます。
GitHub - fluent/fluent-logger-java: A structured logger for Fluentd (Java)

maven dependencyにfluent-loggerを指定します。

pom.xml

<dependencies>
    <dependency>
        <groupId>org.fluentd</groupId>
        <artifactId>fluent-logger</artifactId>
        <version>0.3.3</version>
    </dependency>
</dependencies>

Main.java

public class Main {
    private static FluentLogger LOGGER = FluentLogger.getLogger("app", "localhost", 24224); // (1)

    public static void main(String[] args) {
        Map<String, Object> data = new HashMap<String, Object>();
        data.put("name", "Andy");
        data.put("age", "21");
        data.put("country", "America");

        LOGGER.log("user", data); // (2)
    }
}

(1) FluentLogger.getLogger()でロガーを取得。
 第1引数がtagのprefixになります。第2引数,第3引数でホスト名とポートを指定。
 (ローカルのfluentdの場合は第2、第3引数は省略可)

(2) log()でMapを出力します。第1引数がtagになります。
 FluentLogger.getLogger()で指定したprefixが付くので、
 この場合、app.userがtagになります。


実行してtd-agentのログを確認。

$ sudo tail -f /var/log/td-agent/td-agent.log
2018-02-14 21:16:06 +0900 app.user: {"country":"America","name":"Andy","age":"21","timestamp":1518610566825}
2018-02-14 21:16:50 +0900 [info]: Connection opened to Elasticsearch cluster => {:host=>"localhost", :port=>9200, :scheme=>"http"}

app.userのタグで、Mapの内容が出力されていることが分かります。

fluent-logger-golang

goでfluentdにログを流してみます。
GitHub - fluent/fluent-logger-golang: A structured logger for Fluentd (Golang)

go getでfluent-logger-golangを取得します。

$ go get github.com/fluent/fluent-logger-golang/fluent

確認。

$ go list ./...
github.com/fluent/fluent-logger-golang/fluent

main.go

import (
	"fmt"

	"github.com/fluent/fluent-logger-golang/fluent"
)

func main() {
	logger, err := fluent.New(fluent.Config{FluentHost: "localhost", FluentPort: 24224}) // (1)

	if err != nil {
		fmt.Println(err)
	}
	defer logger.Close()

	tag := "app.user" // (2)
	var data = map[string]string{
		"name":    "Bobby",
		"age":     "34",
		"country": "Japan",
	}

	error := logger.Post(tag, data) // (3)

	if error != nil {
		fmt.Println(error)
	}
}

(1) fluent.New()でロガーを作成。
 fluent.Config{}でホスト名とポートを指定してます。

(2) javaの時と同様にtagにはapp.userを指定。
(3) logger.Post()でmapを出力。


実行してtd-agentのログを確認。

2018-02-22 21:32:20 +0900 app.user: {"age":"34","country":"Japan","name":"Bobby"}
2018-02-22 21:32:52 +0900 [info]: Connection opened to Elasticsearch cluster => {:host=>"localhost", :port=>9200, :scheme=>"http"}

app.userのタグで、mapの内容が出力されていることが分かります。

kibana確認

念のためkibanaで確認してみます。

indexにapplog*を指定して、Discoverで確認してみます。

fluent-logger-java と fluent-logger-golang で送ったログが確認出来ました。

f:id:pppurple:20180302032027p:plain



終わり。

ソースは下記に上げました。
github.com
github.com