私はエンタープライズ システムのロギング フレームワークに取り組んでおり、logback と log4j の両方をロギング バックエンドとして検討していますが、slf4j を使用してバックエンドの実装を除外しようとしています。
メッセージを JSON 形式でログアウトしたいのですが、log4j の Layout クラスと、それを行う logback の Encoder を見つけました。ただし、任意のキーと値のペアを JSON 出力に追加できるようにしたいと考えています。
レイアウト/エンコーダーがログに記録されているオブジェクトのタイプを検出できることを望んでいました。マップの場合はキーと値のペアを JSON に追加しますが、それ以外の場合は単に toString() します。
ただし、slf4j インターフェースは String オブジェクトのロギングに制限されているように見えるため、これは可能ではないようです。
Markers、MDC、および NDC について調べましたが、どれも私のニーズに十分に適合していないようです。
明確にするために、最適なコードスニペットを次に示します。
Map m = new HashMap();
m.put("foo", "bar");
m.put("baz", "fluffbunny");
log.info(m);
これは次のような出力になります。
{ "timestamp": "2013-03-04T13:33:40", "foo": "bar", "baz": "fluffbunny" }
また
{ "timestamp": "2013-03-04T13:33:40", "message": { "foo": "bar", "baz": "fluffbunny" } }
JSON 文字列をメッセージとしてレンダリングしたり、ログ ステートメントの周りに MDC を使用したりするなどの回避策があります (私のレイアウト/エンコーダー クラスは MDC と NDC を正しくレンダリングします) が、どちらの場合もログ行が乱雑になります。
だから私の質問は、これを行う便利な方法があるかどうかです。SLF4J に固執することは確かにプラスですが、特定のバックエンドを使用する利点がバックエンドにとらわれないことの利点を上回る場合は、おそらく必要ありません。