[解決済み] LoggerFactory.getLogger(ClassName.class) vs LoggerFactory.getLogger(this.getClass().getName())
質問
私はJavaで最適化のスキルを向上させようとしています。そのために、私が作った古いプログラムがあり、それをより良くするために最善を尽くしています。このプログラムでは、ロギングにSL4Jを使っています。ロガーを取得するために、私はこうしました。
private static final Logger logger = LoggerFactory.getLogger(this.getClass().getName());
このコードを書いた時点では、クラス名への参照を削除するため、これが最良の選択肢だと思いました(これはリファクタリングされる可能性があります)。しかし、今はもう自信がありません...。
private static final Logger logger = LoggerFactory.getLogger(ClassName.class);
一方、クラス名への参照は維持されますが、メソッド呼び出しが1つ削除されます。これは、1つのクラスに対しては大きなパフォーマンス向上にはならないかもしれませんが、たくさんのクラスがある場合には、何か意味があるかもしれません。
そこで質問です。
どちらのアプローチが良いのでしょうか?クラス名を使うか、リフレクションで取得するか?
賛否両論で答えの動機付けをお願いします。ありがとうございました。
どのように解決するのですか?
ここで私の意見を述べさせていただきます。パフォーマンスの観点からは気にしなくていいケースだと思います。おそらくコードの中には、この件よりもずっと最適化できる部分があるはずです :)
さて、ご質問の件です。まず LoggerFactoryの コード
なお
getLogger(Class<?> name)
はオーバーロードされたメソッドを呼び出すだけです。
Logger logger = getLogger(clazz.getName());
そして、いくつかの追加計算を行います。ですから、Stringを使ったメソッドの方が明らかに若干速いです。
一般的には、Loggerの参照をクラスの静的フィールドとして保持するパターンが多いようです。
public class SomeClass {
private static final Logger LOG = LoggerFactory.getLogger(SomeClass.class);
}
この場合、実際に使用できるのは
this.getClass()
なぜなら
this
は実際には存在しません (静的なコンテキストで実行されています)。
私の経験では
ClassName.getClass()
ただし、異なるクラスから同じロガーを使用したい場合は、この限りではありません。そのような場合は、ロガーを示す何らかの論理的な定数を使用した方がよいでしょう。
例えば、3つの異なるクラスを使ってデータベースにアクセスしようとしているとします。 そこで、ロガー 'DB' を作成し、 database.log に書き込むファイルアペンダを割り当て、 3つの異なるクラス間で同じロガーを再利用したいとします。
そこで、以下のようなコードを使用する必要があります。
public class SomeClass {
private static final Logger LOG = LoggerFactory.getLogger("DB");
}
これが役に立つといいのですが
関連
-
[解決済み] HashMapのtoString関数はなぜ異なる順序で自分自身を印刷するのですか?
-
[解決済み] Java - JTextFieldが空かどうかを確認する
-
[解決済み] この配列の中の数字を入れ替えるには、何が足りないのでしょうか?ジャバ
-
[解決済み] JAVA_OPTIONS、JAVA_TOOL_OPTIONS、JAVA_OPTSの違いについて
-
[解決済み] Java の文字列インデックスが範囲外です。0 [閉店]
-
[解決済み] アニメーションGIFの表示
-
[解決済み] init-paramとcontext-param
-
[解決済み] ヘッドリカーシオンとテールリカーシオンの違い [重複]について
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み】なぜjava.util.loggingを使用しないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] コレクションへの共有参照が見つかりました org.hibernate.HibernateException
-
[解決済み] Oracle DB : java.sql.SQLException: 閉じた接続
-
[解決済み] javacが「using unchecked or unsafe operations」という警告を出す原因は何ですか?
-
[解決済み] javax.naming.NameNotFoundException
-
[解決済み] 午前0時からの時間を秒単位で取得する方法
-
[解決済み] Java: getInstanceとStaticの比較
-
[解決済み] Javaコンパイラーエラー:ステートメントではありません
-
[解決済み] java swingアプリケーションでJCEがプロバイダBCを認証できない
-
[解決済み] .lengthが解決できない、またはフィールドでない
-
[解決済み] なぜロガーは static final と宣言するのですか?