3

根据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: ", "" }));

目前尚不清楚幕后是否检查日志级别。

4

2 回答 2

5

从 2.2.2 开始:没有。

Grails 将一个 apache commons Log 字段注入到 artefact 类中,log4j 插件将它与 log4j Logger 结合起来。

但是,在您的示例中,您将 aGString作为唯一参数传递。由于它们被延迟转换为 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 转换以添加检查的讨论,但它没有去任何地方。

于 2013-06-20T18:47:13.830 回答
2

好的响应 GStrings 是延迟加载的,这似乎不符合我的测试。

我创建了一个测试,基本上以四种不同的方式记录一些东西,它似乎确实评估了任何日志记录语句 GString。

这是我的测试文件 GIST: https ://gist.github.com/tgsoverly/34f9a56287291297777b

GString的测试失败,并且在日志语句中调用了该方法。

根据他们的模板部分,时髦的人说的也不应该是这种情况:http: //groovy.codehaus.org/Strings+and+GString

于 2014-06-27T20:04:53.617 回答