1

我在 Spring Boot 应用程序中使用 SLF4J 和 Logback。我对使用惰性日志记录很感兴趣,经过一些研究,我想出了这个解决方案。

这按预期工作,如果日志记录级别不匹配,则不会调用方法。

logger.debug("Begin proceed aspect Method {} : initiator={} | recepient={} | tx_type={}",
                new Object() {@Override public String toString() { return proceedingJoinPoint.getSignature().getName(); }},
                new Object() {@Override public String toString() { return request.getAgentAlias(); }},
                new Object() {@Override public String toString() { return request.getSubscriberMobile(); }},
                new Object() {@Override public String toString() { return request.getTxType(); }});

如您所见,我正在创建新对象并一遍又一遍地覆盖 toString 方法。我不想这样做。有一个更好的方法吗?

我正在使用与 Spring Boot 启动器捆绑在一起的 SLF4J 1.7.28 版本。请注意,我更喜欢使用 SLF4J 而不是其他日志记录框架。

我尝试了 slf4j-api 2.0.0-alpha1版本以及slf4j-simple绑定,因为它具有 logger.atDebug.log() 实现。但我无法让它正常工作。

谢谢你。

4

2 回答 2

1

更好的方法:

if (logger.isDebugEnabled()) {
    logger.debug("Begin proceed aspect Method {} : initiator={} | recepient={} | tx_type={}",
                 proceedingJoinPoint.getSignature().getName(),
                 request.getAgentAlias(),
                 request.getSubscriberMobile(),
                 request.getTxType());
}

或者:

if (logger.isDebugEnabled()) {
    logger.debug("Begin proceed aspect Method " + proceedingJoinPoint.getSignature().getName() +
                 " : initiator=" + request.getAgentAlias() +
                 " | recepient=" + request.getSubscriberMobile() +
                 " | tx_type=" + request.getTxType());
}
于 2020-04-15T10:44:23.170 回答
1

如果您想添加一些条件行,您可以添加一条 if 语句来检查是否启用了日志级别,然后记录消息。

延迟加载被保留,但你会得到类似的东西:

if(log.isDebugEnabled()) {
 log.debug(....);
}
于 2020-04-15T10:25:50.480 回答