つかびーの技術日記

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

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

   

前にfluentd + scalaでロギングするときのライブラリについて解説しました。

詳細は以下をご覧下さい。

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

上記の記事ではfluent-logger-scalaを推奨しました。このライブラリについてもう少し書いて行きます。

任意のオブジェクトをloggingしようとしてもできない例

FluentLoggerのlog関数の引数はMap[String, Any]なので、何でも詰め込めます。mapでなく、単一objectを取る関数もAnyなので、何でも渡せます。

ですが、実際には何でも渡して正しく機能する訳ではありません。

例えば、以下のように例外を渡しても・・・

実際にはこのように何も表示されません。

Loggableを使ってloggingする

ではどうするかというと、FluentLoggerにはLoggableというtraitが用意されています。これを使います。

Loggable traitを実装するということはmapへ変換できるようにする、という意味です。つまり結局はMapで扱う、と認識しておけば良いと思います。

例えばこういう感じのコードを用意しておいて、

実行すると以下のような感じでログ出力されます。

(良くわからないので、整形します)

こんな感じでExceptionのメッセージやstack traceを保持したままloggingできました。

解説は特にすることありませんが、一応補足します。

logger.logの部分で例外を渡していますが、これはimplicit conversionによってLoggableへ変換されます。これによりloggingが可能な状態になります。冒頭で定義されているimplicit conversionはThrowableを受け取って愚直にMapに変換するLoggable objectを返しています。

こんな感じで必要に応じてLoggableを作れば何でもロギングできるようになります。

意外と簡単なので皆さんやってみると良いかと思います。

 - Scala, ライブラリ , ,