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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Grails 3将非String对象记录为第一个参数相关的知识,希望对你有一定的参考价值。

在我的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()之前将表达式连接成一个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)

以上是关于Grails 3将非String对象记录为第一个参数的主要内容,如果未能解决你的问题,请参考以下文章

在 grails-app 之外的 Grails 类中注入日志对象

如何在 Grails 中复制域对象?

向 Grails 中的对象添加方法并使其全局可用

如何在 grails 1.3.7 中记录 sql

JavaScript 入门

log4j与Grails 3.2.3:我没有得到任何记录