1. 概要

Log4j 2 ライブラリは、バージョン2.4以降、Java8ラムダ式のサポートを追加しました。 これらの式は、ロガーインターフェイスでレイジーロギングを有効にするために使用できます。

この機能を利用する方法の簡単な例を見てみましょう。

Log4j 2 の詳細については、紹介記事もご覧ください。

2. ラムダ式を使用したレイジーロギング

対応するログレベルが有効になっていない場合、ログメッセージの計算を回避することで、ログを使用するアプリケーションのパフォーマンスが向上する可能性があります。

まず、TRACEレベルの簡単なログステートメントを見てみましょう。

logger.trace("Number is {}", getRandomNumber());

この例では、 getRandomNumber()メソッドが呼び出され、TRACEステートメントが表示されているかどうかに関係なく、ログメッセージパラメーターが置き換えられます。 たとえば、ログレベルがDEBUGに設定されている場合、 log4j 2 はメッセージをログに記録しませんが、 getRandomNumber()メソッドは引き続き実行されます。

つまり、このメソッドの実行は不要な場合があります。

ラムダ式のサポートを追加する前に、ログステートメントを実行する前にログレベルを明示的にチェックすることで、ログに記録されないメッセージの作成を回避できました。

if (logger.isTraceEnabled()) {
    logger.trace("Number is {}", getRandomNumer());
}

この場合、 getRandomNumber()メソッドは、TRACEログレベルが有効になっている場合にのみ呼び出されます。 これにより、パラメーターの置換に使用されるメソッドの実行にかかるコストに応じて、パフォーマンスを向上させることができます。

ラムダ式を使用することで、上記のコードをさらに簡略化できます。

logger.trace("Number is {}", () -> getRandomNumber());

ラムダ式は、対応するログレベルが有効になっている場合にのみ評価されます。 これはレイジーロギングと呼ばれます。

ログメッセージに複数のラムダ式を使用することもできます。

logger.trace("Name is {} and age is {}", () -> getName(), () -> getRandomNumber());

3. 結論

このクイックチュートリアルでは、 Log4j2ロガーでラムダ式を使用する方法を説明しました。

いつものように、例の完全なソースコードは、GitHubにあります。