log4j
を直接使用するアプリケーションがあるとします。つまりslf4j
、他のラッパーを使用せずに使用します。を に置き換えたいと思いlog4j
ますlogback
。slf4j
(または他のラッパー)を使用する必要がありますか? 「良い習慣」とは何ですか?
4 に答える
slf4j API を使用する必要があります。後で log4j などに戻す場合は、slf4j ブリッジを変更するだけで済み、アプリケーションのログ コードは変更せずに機能します。さらに、http://www.slf4j.org/にアクセスすると、slf4j が Logback をネイティブ実装と見なしていることがわかります。Logback は実際には SLF4J API をネイティブに実装しています。
Evgeniy Dorofeevが述べたように、logbackはslf4j-apiをネイティブに実装します。これは、slf4j-apiを介したログバックロガーの呼び出し、つまりインスタンスを介した呼び出しでは、org.slf4j.Logger
オーバーヘッドがまったく発生しないことを意味します。ch.qos.logback.classic.Logger
代わりにタイプのロガーを直接呼び出すこともできますがorg.slf4j.Logger
、そうしても利点はありませんが、選択した場合に別のロギングフレームワークに移行するのが難しくなる可能性があります。
ちなみに、ログバックはslf4j-apiの観点から実装されているため、slf4jはログバックのラッパーではありません。
SLF4Jへの移行を容易にするために、ソースコードをslf4jに移行するためのツールがあります。自分で変更できないコードには、log4j、java.util.logging、commons-loggingのブリッジがあります。
実際のロギング バックエンドに関係なく、SLF4J API を使用する非常に正当な理由が 1 つあります。
log.debug("Foo: {}, Bar: {}", foo, bar);
パラメータ構造。Log4j では、ログに記録するために常に完全な文字列が必要ですif
。そのため、ステートメントが高価な文字列に対して有効になっているかどうかを確認するには、 を囲む必要があります。SLF4J は、チェックを行う前に foo.toString() または bar.toString() を呼び出さないため、無効化された呼び出しは安価です。
したがって、ソースを slf4j に移行し、slf4j ダウンロードで適切なブリッジを使用して log4j をバックエンドとして使用することをお勧めします。これにより、これ以上変更することなく、現在と同じように続行できます。必要に応じて、バックエンドをログバックに切り替えることができます。
log4j-over-slf4j.jar
「実際の」Log4Jの代わりに を使用して、コードをまったく変更せずに移行できる場合があります。これは、Log4J と同じ API をクライアントに提供しますが、ロギング呼び出しを SLF4J に送信し、SLF4J はそれらを logback に送信できます。
ただし、コードを変更するオプションがある場合は、SLF4J を使用するように変更することをお勧めします。その後、必要に応じて任意のバックエンド (logback、log4j など) に交換できます。してはいけないことの 1 つはlog4j-over-slf4j
、Log4J バックエンドと組み合わせようとすることです...