使用SLF4J简化延迟日志记录

时间:2020-04-15 10:15:38

标签: java logging slf4j lazy-evaluation slf4j-api

我在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方法。我不想这么做有一个更好的方法吗?

我正在使用SLF4J 1.7.28版本,该版本与Spring Boot启动程序捆绑在一起。 请注意,与其他日志记录框架相比,我更喜欢使用SLF4J。

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

谢谢。

2 个答案:

答案 0 :(得分:0)

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

保留了延迟加载,但您将得到类似的内容:

if(log.isDebugEnabled()) {
 log.debug(....);
}

答案 1 :(得分:0)

更好的方法:

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