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对象记录为第一个参数的主要内容,如果未能解决你的问题,请参考以下文章