fluent-loggerを使ってfluentdにログを送ってみる
fluent-loggerを使ってfluentdにログを転送してみたメモです。
各言語から直接fluentdにログを送るのはどうするのか分からなかったので調べてみると、
fluentのGitHubリポジトリに各言語ごとのfluent-logger-xxxxがありました。
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 で送ったログが確認出来ました。
終わり。
ソースは下記に上げました。
github.com
github.com