28

私は常に次のパターンを使用して(SLF4J)ロガーを作成しました。

private static final Logger log = LoggerFactory.getLogger(MyClass.class);

これはこれまでのところうまくいきましたが、staticある時点でコンテキストと、次のような非静的ロガーを使用するのではなく、常に具象クラスリテラルを渡す必要があるのではないかと考えていました。

private final Logger log = LoggerFactory.getLogger(getClass());

これは基本的に、LOG4Jについてここまでに質問(および回答)されています

ロガーはプライベートスタティックであるかどうか

そしてここ

ロガーは常に最終的で静的である必要がありますか?

基本的に必須であることに気付いfinalたので、非静的コンテキストでSLF4Jを使用するオーバーヘッドが実際にどれほど高いのか疑問に思います。

Q:

使用することの重要な実際的なオーバーヘッドはありますか

private final Logger log = LoggerFactory.getLogger(getClass());

以上

private static final Logger log = LoggerFactory.getLogger(MyClass.class);

平均的な(ウェブ)アプリでは?(ここでハイエンドで高負荷のWebアプリについて「議論」する必要はありません)


注意してください、私は最終的に、CDIを使用してさらに優れたアプローチを使用して、次のようなSLF4Jロガーを取得することを計画しています。

@Inject private final Logger log;

ここで説明されているようにhttp://www.seamframework.org/Weld/PortableExtensionsPackage#H-TtLoggerttInjectionですが、最初にロガーキャッシングについて知る必要があります。

サブ質問:使用することも可能ですか?:

@Inject private static final Logger log;

(正直に言うと、CDIから始めたばかりです)

4

2 に答える 2

26

非静的(インスタンス)ロガー変数のオーバーヘッドは、多くの、たとえば10000以上のインスタンス化が発生しない限り、無視できるはずです。ここでのキーワードはごくわずかです。多くの(> 10000)オブジェクトがインスタンス化される場合、影響はおそらく測定可能ですが、それでも低いです。

より具体的には、インスタンスロガーは、オブジェクトインスタンスごとに1つの参照(64ビット)だけメモリフットプリントを増やします。CPU側では、コストはインスタンスごとに1つのハッシュルックアップです。つまり、ハッシュテーブル(小さい)で適切なロガーをルックアップするコストです。繰り返しますが、多くのオブジェクトが作成されない限り、両方のコストは無視できるはずです。

この質問は、SLF4JFAQでも説明されています。

于 2012-05-04T21:54:34.817 に答える
2

LoggerFactoryを使用する場合の正確なオーバーヘッドについてはわかりませんが、アプリケーションのパフォーマンスに影響することはないと思います。したがって、適切と思われる場合は、静的または非静的を使用してください。

@Injectを使用する利点は何でしょうか。LoggerFactoryは、具体的なimplからの抽象化をすでに提供しています。いずれにせよ、LoggerFactoryよりもはるかに遅くなります。

真の@Injectを使用すると、構文がより簡潔になります。しかし、テストでクラスを使用するとします。次に、ロギングを取得するためにインジェクションを設定する必要があります。通常のLoggerFactoryを使用すると、テストでもうまく機能します。Javaに@Injectの汎用メカニズムがある場合、それはうまく機能しますが、それがそうであるため、セットアップはより困難です。

于 2012-05-04T21:42:17.903 に答える