Grails 3 记录非字符串对象作为第一个参数

Grails 3 logging non String object as first argument

在我的 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 3 使用 Logback 作为日志库,它支持变量替换,使日志记录更加高效。

用户经常记录这样的语句

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

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

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

但这会使您的代码混乱。使用 Logback 虽然这样做会更好:

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

现在您只需传递一个简单的字符串加上两个参数以在指定位置进行插值,但前提是为记录器的级别启用了日志语句。如果不是,调用几乎是空操作。

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

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

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