根据
http://docs.codehaus.org/display/GROOVY/Groovy+1.8+release+notes#Groovy18releasenotes-Log,groovy使用isDebugEnabled()等检查来包围日志语句.
对于grails服务中的此日志调用:
log.debug("competitors errors stage 1: ${FailedCarrierRequests}")
在反编译的.class文件中,我只看到这个:
arrayOfCallSite[85].call(log,new GStringImpl(new Object[] { allCompetitorDepartmentsRows.get() },new String[] { "All competitors: ","" }));
目前还不清楚是否在幕后检查日志级别.
解决方法
截至2.2.2:没有.
Grails将一个apache commons Log字段注入artefact类,而log4j插件将它与log4j Logger结合在一起.
但是,在您的示例中,您将GString作为唯一参数传递.由于它们被惰性转换为Java字符串,因此log4j记录器会点击它自己的内部调试启用检查并跳过toString()调用.
但是,如果你做了像参数构建那样昂贵的事情,并且你担心浪费的周期,你必须自己调用isDebugEnabled():
if (log.isDebugEnabled()) { log.debug("Some string concatenation with a slow method: " + slowMethod()) }
我应该指出,这个人为的示例可以转换为使用GString来保存调试检查:
log.debug "GString with lazily initialized slow method call: ${slowMethod()}"