Log4j 2とラムダ式

Log4j 2およびラムダ式

1. 概要

Log4j 2ライブラリは、バージョン2.4以降、Java8ラムダ式のサポートを追加しました。 These expressions can be used by the Logger interface to enable lazy logging.

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

Log4j 2の詳細については、introductory articleも確認してください。

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

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

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

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

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

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

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

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

この場合、getRandomNumber()メソッドは、TRACEログレベルが有効になっている場合にのみ呼び出されます。 This can improve performance depending on how expensive the execution of methods used to substitute parameters is.

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

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

The lambda expression is only evaluated if the corresponding log level is enabled.これはレイジーロギングと呼ばれます。

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

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

3. 結論

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

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