根据http://docs.codehaus.org/display/GROOVY/Groovy+1.8+release+notes#Groovy18releasenotes-Log,groovy使用isDebugEnabled()等检查来包围日志语句。
grails是否为生成的代码执行此操作?
对于grails服务中的此日志调用:
log.debug("competitors errors stage 1: ${failedCarrierRequests}")
在反编译的.class文件中,我只看到:
arrayOfCallSite[85].call(log, new GStringImpl(new Object[] { allCompetitorDepartmentsRows.get() }, new String[] { "All competitors: ", "" }));
目前还不清楚是否在幕后检查日志级别。
答案 0 :(得分:5)
截至2.2.2:否。
Grails将一个apache commons Log字段注入artefact类,而log4j插件将它与log4j Logger结合起来。
但是,在您的示例中,您传递GString
作为唯一参数。由于它们被惰性转换为Java Strings
,因此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()}"
在grails-user邮件列表上有一些关于添加AST转换以添加检查的讨论,但它没有去任何地方。
答案 1 :(得分:2)
好的回答是GStrings延迟加载似乎不能阻止我的测试。
我已经创建了一个测试来基本上记录四种不同的方式,它似乎评估任何日志记录语句GString。
这是我的测试文件GIST:https://gist.github.com/tgsoverly/34f9a56287291297777b
在日志语句中,GString和 IS 方法的测试失败。
根据他们的模板部分,groovy人员说的情况也不应该是这样的:http://groovy.codehaus.org/Strings+and+GString