web-dev-qa-db-ja.com

SLF4J APIのラムダサポート

Log4jの最新のAPIには、デバッグオプションを簡単に管理できるLambdaサポートがあります。

例:

logger.debug("This {} and {} with {} ", 
  () -> this, () -> that, () -> compute());

ただし、slf4j/logbackには、上記のようにラムダを有効にするオプションがあります。構文を教えてください。

29
Souvik

残念ながら、これはまだサポートされていません: https://jira.qos.ch/browse/SLF4J-371

10
Mariano Ruiz

slf4j-lambda は以下をサポートします:

import kr.pe.kwonnam.slf4jlambda.LambdaLogger;
import kr.pe.kwonnam.slf4jlambda.LambdaLoggerFactory;

LambdaLogger log = LambdaLoggerFactory.getLogger(YourClass.class);

// lambda for message itself
log.debug(() -> createMessage("debug level"));

// lambda for message format's arguments
log.info("info lambda formatter number {}, string {}", () -> 123, () -> "Hello LambdaLogger");

// method reference
public String longRunnigMethod() {
    return "some long running method";
}

log.debug("Long running method logging {}", this::longRunnigMethod);

// exception logging
log.error(() -> "error lambda exception msg - " + ex.getMessage(), ex);
6
koppor

多分このようなものがうまくいくでしょう。 newingインスタンスのコストが別の方法よりも優れているかどうかを判断する必要があります。

logger.debug("This {} and {} with {} ",
    defer(() -> this),
    defer(() -> that),
    defer(() -> compute()));

次にこれで...

import lombok.NonNull;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor(staticName = "defer")
public class LogString {
    @NonNull private final StringGenerator generator;

    @Override
    public String toString() {
        return generator.createString();
    }

    public interface StringGenerator {
        String createString();
    }
}
3
TJR