ロギングアプリケーションでクロス関心事です。
一般的なケースでは、インターセプタ/アスペクトパターンを使用して行います。ログが書き込まれていない場合であっても適用されるよう
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);
を*は*「このコードは、多くの方法で私には完全に間違って見えますか」?反射が遅いことが知られているので、パフォーマンスが低下する可能性があります – MadProgrammer
ホイールを改造するのではなく、適切なロギングパターンを使用する方が簡単で、おそらくもっと効率的でした。 – assylias