web-dev-qa-db-fra.com

Prise en charge de Lambda pour l'API SLF4J

Dans la dernière API Log4j, nous avons un support Lambda où je peux gérer facilement l'option de débogage.

Exemple:

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

Mais pour slf4j/logback, existe-t-il une option pour activer lambda comme mentionné ci-dessus. Veuillez alors me faire connaître la syntaxe.

29
Souvik

Malheureusement, cela n'est pas encore pris en charge: https://jira.qos.ch/browse/SLF4J-371

10
Mariano Ruiz

slf4j-lambda prend en charge:

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

Peut-être que quelque chose comme ça fonctionnerait. Vous devrez déterminer si le coût des instances de new 'est meilleur que de le faire d'une autre manière.

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

Alors avec ça ...

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