つかびーの技術日記

情報系修士卒のWeb系技術日記です。現在のフォーカス分野はアドテクです。

Scalaでfluentd loggingするときのライブラリ比較

      2015/02/03

Scalaプログラム内でfluentdを使ったロギング処理を書きたい場合についての話です。

fluentdなので、わざわざプログラム内部でロギングせずとも、他の一般的な方法(例えばlog4j)でファイルにログ出力して、それをfluentdのtailプラグインで拾う・・・という手法が最も楽だと思います。

勿論これでも良いですが、折角ならばより柔軟にロギングしたいと思うかもしれません。

そんなときはライブラリを使いましょう。

ライブラリの候補

  1. https://github.com/InnovaCo/fluentd-scalaLogbackのappenderを経由してfluentdへログ出力できます。Logbackのappenderなので、Logbackと同じI/Fという利点があります。
  2. https://github.com/oza/fluent-logger-scala内部でfluent-logger-javaを利用したライブラリです。独自のLoggerクラスを使って単一の文字列やMapをログ出力します。独自のクラスを使うので、Logbackなどと親和性が無い点は辛いですが、その分自由度は高いです。
    ozaさんのリポジトリとなっていますが、公式ライブラリのようです。
  3. https://github.com/sndyuk/logback-more-appendersLogbackのappenderを経由してfluentdへログ出力できます。1と同じ感じです。
  4. https://github.com/fluent/fluent-logger-javaJava用のライブラリです。公式。

実行例など(fluentd-scala)

インストールはREADMEに従ってsbtに依存性を書きます。logback.xmlも用意して、以下のようなプログラムを実行します。

これだけでOKです。実行結果はこんな感じでfluentdにlog出力されます。

見づらいのでjson部分のみ整形すると・・・

こんな感じです。

例外の場合も見てみます。

throwableが追加されています。

非常に簡単に使えて、既存のloggerの置き換え等にも対応できるというメリットがあります。反面、Logger.infoなどに任意のobjectを与えられないため、微妙に使いづらいです。

実行例など(fluentd-logger-scala)

これも同様にインストールはREADMEを参考にしてください。こちらはlogbackとは関係ないので、sbtの依存性と以下のコードだけで動きます。

実行結果はこちら。

先ほどの例と比べると簡素ですが、その分柔軟性があります。

第二引数にはMapが使えるので、例えば以下のようなコードを書くと

こんな風にネストした形で、正しいjsonで出力されます。

logback-more-appendersについて

これも結局はlogback経由なので、初めのfluentd-scalaと同じです。用意されているappenderを使うだけです。ちなみにJavaライブラリです。

fluent-logger-javaについて

これもfluent-logger-scalaと同じです、というよりはfluent-logger-scalaの中身です。なので、やっていることは変わりません。

結局どれを使えばいいの?

オススメはfluent-logger-scalaですが、上記のようにメリットデメリットがあります。

  • fluentd-scala
    なるべく楽したい人、logbackのI/F(Logger class)で統一したい人向け
  • fluent-logger-scala
    柔軟に色々出力したい人、自分でlogのjsonの各fieldをコントロールしたい人、とにかく何でもloggingしたい人向け

ちなみに自分はfluent-logger-scalaを利用しています。かなりいい感じです。

みなさんも使ってみてはいかがでしょうか。

以下の記事でfluent-logger-scalaをもう少し解説しています。

fluent-logger-scalaで任意のobjectをlogging可能にする方法

 - Scala, ライブラリ , , ,