Lambda支持SLF4J API

Sou*_*vik 21 java logback slf4j

在Log4j最新的API中,我们有Lambda支持,可以轻松管理Debug选项.

例:

logger.debug("This {} and {} with {} ", 
  () -> this, () -> that, () -> compute());
Run Code Online (Sandbox Code Playgroud)

但是对于slf4j/logback,有任何选项可以启用lambda,如上所述.那么请让我知道语法.

Mar*_*uiz 10

不幸的是,这还不支持:https://jira.qos.ch/browse/SLF4J-371


Bas*_*que 7

SLF4J – version 2

Version 2 of SLF4J has support for lambda syntax.

This new version also brings a fluent API. Version 2 requires Java 8 or later.

As of 2020-06, version 2 is still in the experimental/unstable phase, with the most recent alpha release being from 2019-10.

Maven POM setting:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>2.0.0-alpha1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

See the Download page.


kop*_*por 6

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);
Run Code Online (Sandbox Code Playgroud)

  • @downvoters请留下评论,为什么您不喜欢这个答案。是因为您不想添加其他库,还是因为该库当前仅在GitHub上有7星? (4认同)
  • 因为我们不想在登录libs zoo中有更多依赖项.在slf4j中有一个支持lambdas的请求(https://jira.qos.ch/browse/SLF4J-371),log4j中已有这样的功能.请不要创建另一个lib,而是在slf4j中提出一个pull请求. (3认同)
  • @ Mr.Cat请联系lib的作者和/或获取代码并将其集成到slf4j中。再次仔细检查许可证 (2认同)
  • https://jira.qos.ch/browse/SLF4J-371自2016年以来一直坐在那里。这里的旧讨论http://slf4j.42922.n3.nabble.com/Lambda-support-in-SLF4J-td4026483.html 。 (2认同)

TJR*_*TJR 4

也许这样的事情会起作用。您需要确定new实例的成本是否比其他方式更好。

logger.debug("This {} and {} with {} ",
    defer(() -> this),
    defer(() -> that),
    defer(() -> compute()));
Run Code Online (Sandbox Code Playgroud)

那么有了这个...

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果未设置调试级别,这实际上会推迟执行吗?我相信 JVM 实际上会调用 defer() 方法,该方法将调用 lambda。也许你可以在那里放一个分支来检查日志级别 (2认同)