Grails 3将非String对象记录为第一个参数

问题描述 投票:0回答:1

在我的Grails 3.3.2应用程序的BootStrap.groovy中,我在记录时遇到以下异常:

groovy.lang.MissingMethodException: No signature of method: ch.qos.logback.classic.Logger.info() is applicable for argument types: (org.apache.http.message.BasicStatusLine) values: [HTTP/1.1 200 OK]

这是日志声明:

log.info(resp.statusLine)

我知道我可以通过在info方法上调用toString()来解决这个问题,但这不是一个好的解决方案,因为我可能需要修复许多日志语句来解决以前有效的代码问题。是否有针对此问题的错误?

grails
1个回答
1
投票

Grails 3使用Logback作为日志库,它支持变量替换,使日志记录更加高效。

通常用户记录如下的语句

log.debug('found ' + items.size() + ' items: ' + items)

这很昂贵,因为在调用debug()之前将表达式连接成一个String,并且如果该记录器的级别不是DEBUG或TRACE,则不会记录任何内容,因此如果连接的String很大(或者如果经常调用它)那工作就浪费了。您可以在启用的检查中包装呼叫:

if (log.isDebugEnabled()) {
   log.debug('found ' + items.size() + ' items: ' + items)
}

但这会使你的代码变得混乱。使用Logback虽然你做得更好:

log.debug('found {} items: {}', items.size(), items)

现在你只是传递一个简单的字符串和两个args来在指定的位置进行插值,但前提是日志语句是为记录器的级别启用的。如果不是这个电话几乎是无操作。

对于您的日志记录语句,您应该这样做:

log.info('{}', resp.statusLine)

要么

log.info('Status: {}', resp.statusLine)
© www.soinside.com 2019 - 2024. All rights reserved.