覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Lombok - @Log

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);
        }
    }
}



関連エントリ