Lombokから提供されるロギング(ロガー)用のアノテーションのサンプルです
https://projectlombok.org/features/Log.html
ロガーを利用する際の普通のコード
業務アプリケーションで、ロガーを利用してアプリケーションログを出力するというのはごくごく一般的だと思います。
その際には通常以下のようなコードを書くことになると思います(slf4jを利用する場合)。
public class BusinessLogic { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(BusinessLogic.class); public void doSomething(String param) { log.info("doSomething start [param: {}]", param); randomWait(); log.info("doSomething end"); } private void randomWait() { Random r = new Random(); int i = r.nextInt(100); try { Thread.sleep((i + 1) * 10); } catch (InterruptedException e) { log.error("interruput,", e); } } }
staticなメンバにロガーのインスタンスを保持する部分などは、
ビジネスロジックとは無関係なものであるにも関わらず記述しなければならない典型的なボイラープレートコードと言ってもよいと思います。
Lombokのアノテーションを利用することでこのstaticメンバのロガーの記述を削減できます
(以下のいずれの例でもいえることですが、利用したいロガーのライブラリがパスに通っている必要があります)
@Slf4j
Javaアプリケーションでのロガーの利用と言ったら基本的に、slf4j経由となると思います。
そのような場合は@Slf4j
(lombok.extern.slf4j.Slf4j)アノテーションをクラスに付与しましょう。
■@Slf4jを付与したクラス
アノテーションを付与したクラスでは log という名前でロガーを使用することができるようになっています
import java.util.Random; import lombok.extern.slf4j.Slf4j; @Slf4j public class BusinessLogic1 { public void doSomething(String param) { log.info("doSomething start [param: {}]", param); randomWait(); log.info("doSomething end"); } private void randomWait() { Random r = new Random(); int i = r.nextInt(100); try { Thread.sleep((i + 1) * 10); } catch (InterruptedException e) { log.error("interruput,", e); } } }
■実際に生成されているソースコード
実際に生成されているソースコードをdelombokを使って確認してみました。
slf4jのロガーが生成されていることが分かります
import java.util.Random; public class BusinessLogic1 { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(BusinessLogic1.class); public void doSomething(String param) { log.info("doSomething start [param: {}]", param); randomWait(); log.info("doSomething end"); } private void randomWait() { Random r = new Random(); int i = r.nextInt(100); try { Thread.sleep((i + 1) * 10); } catch (InterruptedException e) { log.error("interruput,", e); } } }
@Log4j2
log4j2のロガーを直接使用したい場合は、@Log4j2
(lombok.extern.log4j.Log4j2)アノテーションを付与します。
■@log4j2を付与したクラス
import java.util.Random; import lombok.extern.log4j.Log4j2; @Log4j2 public class BusinessLogic2 { public void doSomething(String param) { log.info("doSomething start [param: {}]", param); randomWait(); log.info("doSomething end"); } private void randomWait() { Random r = new Random(); int i = r.nextInt(100); try { Thread.sleep((i + 1) * 10); } catch (InterruptedException e) { log.error("interruput.", e); } } }
■実際に生成されているソースコード
実際に生成されているソースコードをdelombokを使って確認してみました。
log4j2のロガーが生成されていることが分かります
import java.util.Random; public class BusinessLogic2 { private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(BusinessLogic2.class); public void doSomething(String param) { log.info("doSomething start [param: {}]", param); randomWait(); log.info("doSomething end"); } private void randomWait() { Random r = new Random(); int i = r.nextInt(100); try { Thread.sleep((i + 1) * 10); } catch (InterruptedException e) { log.error("interruput.", e); } } }
@CommonsLog
Apache Commons Logging経由でログ出力したい場合は、@CommonsLog
(lombok.extern.apachecommons.CommonsLog)アノテーションを付与します。
■@CommonsLogを付与したクラス
import java.util.Random; import lombok.extern.apachecommons.CommonsLog; @CommonsLog public class BusinessLogic3 { public void doSomething(String param) { log.info("start doSomething : " + param); randomWait(); log.info("doSomething end"); } private void randomWait() { Random r = new Random(); int i = r.nextInt(100); try { Thread.sleep((i + 1) * 10); } catch (InterruptedException e) { log.error("interruput.", e); } } }
■実際に生成されているソースコード
実際に生成されているソースコードをdelombokを使って確認してみました。
Commons Loggingのロガーが生成されていることが分かります。
import java.util.Random; public class BusinessLogic3 { private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(BusinessLogic3.class); public void doSomething(String param) { log.info("start doSomething : " + param); randomWait(); log.info("doSomething end"); } private void randomWait() { Random r = new Random(); int i = r.nextInt(100); try { Thread.sleep((i + 1) * 10); } catch (InterruptedException e) { log.error("interruput.", e); } } }