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

时间:2018-09-01 05:37:08

标签: grails

在我的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()来解决此问题,但这不是一个好的解决方案,因为我可能需要修复许多日志语句才能解决以前有效的代码。是否为此问题打开了一个错误?

1 个答案:

答案 0 :(得分: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)

现在,您只需传递一个简单的String加上两个args即可在指定位置进行插值,但前提是为记录器级别启用了log语句。如果没有,那几乎是无人接听。

对于您的日志记录语句,您应该改为:

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

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