2017-04-26 10 views
1

私は最近、既存のアプリケーションで以下のコードを記録しています。このコードは、多くの方法このロギングステートメントで何が問題になっていますか?

Method method = ...;// passed in as parameter 
//... 
String className = method.getDeclaringClass().getName(); 
String methodName = method.getName(); 
long id = Thread.currentThread().getId(); 
String name = Thread.currentThread().getName(); 
String msg = String.format("some text, for: %s %s in thread %d %s", className, methodName, id, name); 
LOGGER.debug("xxxxxxxx {}", msg); 

に私には完全に間違って見える私はこのコードでは、すべて間違っているものを

  • を知りたいのですが?
  • パフォーマンスに最も大きな影響を与えるものは何ですか?
  • このようなロギングステートメントを作成する最も良い方法は何ですか?

(注:{}が示すように、それはSLF4Jロガーだとxxxxxxxxはコードベースでこのparticulary loggingステートメントを識別するための固有の文字列です)

+0

を*は*「このコードは、多くの方法で私には完全に間違って見えますか」?反射が遅いことが知られているので、パフォーマンスが低下する可能性があります – MadProgrammer

+1

ホイールを改造するのではなく、適切なロギングパターンを使用する方が簡単で、おそらくもっと効率的でした。 – assylias

答えて

3

ロギングアプリケーションでクロス関心事です。
一般的なケースでは、インターセプタ/アスペクトパターンを使用して行います。ログが書き込まれていない場合であっても適用されるよう

String className = method.getDeclaringClass().getName(); 
String methodName = method.getName(); 
long id = Thread.currentThread().getId(); 
String name = Thread.currentThread().getName(); 
String msg = String.format("some text, for: %s %s in thread %d %s", 
       className, methodName, id, name); 

現在ロガーの有効なレベルの前に確認することなく、これらすべての計算を行うことは非感覚です。
さらに、必要に応じてappenderのパターンでこれらの情報をすべてAPIロガーによって取得することができます。このほかに

はどちらか有効ではないです。

String msg = String.format("some text, for: %s %s in thread %d %s", className, methodName, id, name); 
LOGGER.debug("xxxxxxxx {}", msg); 

また、レベルをチェックする前に、文字列をフォーマットします。実際のコードで

が、これは良いです:...

if (LOGGER.isDebugEnabled()){ 
    String className = method.getDeclaringClass().getName(); 
    String methodName = method.getName(); 
    long id = Thread.currentThread().getId(); 
    String name = Thread.currentThread().getName(); 
    String msg = String.format("some text, for: %s %s in thread %d %s", className, methodName, id, name); 
    LOGGER.debug("xxxxxxxx {}", msg); 
} 

しかし、より堅牢なソリューションは、スレッドID、方法、などでログ情報を飾るためにアペンダのパターンを使用している


最後に、現在のレベルのチェック(ここではif (LOGGER.isDebugEnabled()){)がロギング処理を囲んでいない場合、一般的な方法として、

String msg = String.format("some text, for: %s %s in thread %d %s", className, methodName, id, name); 
LOGGER.debug("xxxxxxxx {}", msg); 

var argsを使用するのは、目的に反したサンプルで使われていないように、var argsを使用する方が効果的です。効果的なロガーレベルが一致しない場合、それは計算を惜しみこのように

: - どのような方法で

LOGGER.debug("some text, for: {} {} in thread {} {}", className, methodName, id, name); 
関連する問題