14

slf4j のメソッドは文字列引数しか受け付けないようですが、そのメソッドを使用するときはすべてを文字列に変換する必要がありますか?

4

3 に答える 3

13

メッセージタイプにObjectではなくStringが必要な主な理由は、メソッドシグネチャのあいまいさを回避するためでした。

次の署名を取ります。

1) debug(Object) // a message
2) debug(Object, Object) // message followed by a parameter
3) debug(Object, Exception)  // message followed by an exception

その後、あなたが書くとき

debug("hello", new Exception("world"));

バリアント2とバリアント3のどちらを使用すべきかは明確ではありません。

いずれの場合も、既存のSLF4J APIを使用すると、いつでも次のように記述できます。

  logger.debug("{}", yourObject);

基盤となるロギングフレームワークがログバックである場合、yourObjectは変更されずにすべてのアペンダーで使用できます。他のロギングフレームワークはメッセージパラメータをサポートしていないため、SLF4Jは基盤となるフレームワークを呼び出す前にメッセージをフォーマットする必要があります。

于 2011-03-29T08:40:17.480 に答える
2

slf4j のメソッドは文字列引数しか受け付けないようですが、そのメソッドを使用するときはすべてを文字列に変換する必要がありますか?

のような 1 引数のメソッドについて話している場合はLogger.debug(String message)、そうです。Logger.debug(String format, Object[] args)しかし、これを必要としない他の方法もあります。

sl4fj の API がこのようなものである理由はわかりませんが (たとえば、log4j の API はそうではありません)、おそらく次のいくつかの組み合わせです。

  • 基礎となるロギング フレームワークの動作に対応しようとしています。
  • パフォーマンスへの影響を最小限に抑えようとします。
  • 「実装者の特権」。

(最後の原則は、ある設計委員会に回答しない 1 人の人物によって何かが設計/実装されている場合、スタイルなどに関するその人物の意見が他の誰よりも重要であるという原則です。)

于 2011-03-29T00:10:43.217 に答える
0

試す

String.valueOf(yourObject)

次に、 toString() メソッドが実際に意味があることを確認してください

于 2011-03-28T23:21:20.003 に答える