编辑:GROOVY-6932已被记录,现已关闭 - 该问题在Groovy v2.4.8中标记为已修复.
我使用@ Slf4j注释向我的groovy类添加日志记录.
我喜欢它,因为AST转换将我的日志调用包装在"启用"检查中,在此处记录
我发现,如果从闭包内调用log方法,则guard子句不起作用.
在Groovy 2.2.0上运行,此代码只记录一条消息,但打印"被叫"两次.
@Grapes([
@Grab(group='org.slf4j', module='slf4j-api', version='1.7+'),
@Grab(group='ch.qos.logback', module='logback-classic', version='1.+')])
import groovy.util.logging.Slf4j
new TestCode().doSomethingThatLogs()
@Slf4j
class TestCode {
void doSomethingThatLogs(){
log.info createLogString(1)
log.trace createLogString(2)
Closure c = { log.trace createLogString(3) }
c()
}
String createLogString(int p){
println "called with $p"
return "blah: $p"
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试将"this","owner"和"delegate"说明符添加到日志语句中但结果相同.
我发现这个上下文的时候是我在使用XmlSlurper解析XML时尝试使用XmlUtil.serialize记录某些节点.
我正在通过使用调用XmlUtil类的toString()方法将NodeChild对象包装在轻量级对象中来解决此问题.这将工作正常,额外的包装类的开销不值得担心.我更感兴趣的是找到一个解决这个问题的简单方法,这样我就可以回过头来不必考虑记录消息的构建成本.
我问的问题是:有没有办法让日志级别保护条款在闭包内正常工作,而不是自己添加"log.traceEnabled"调用?
只是一个快速的想法。您如何知道log.traceEnabled
关闭执行时会发生什么?请参阅修改后的示例...
@Grapes([
@Grab(group='org.slf4j', module='slf4j-api', version='1.7+'),
@Grab(group='ch.qos.logback', module='logback-classic', version='1.+')])
import groovy.util.logging.Slf4j
import jline.internal.Log
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
new TestCode().doSomethingThatLogs()
@Slf4j
class TestCode {
void doSomethingThatLogs(){
log.info createLogString(1)
log.trace createLogString(2)
Closure c = { log.trace createLogString(3) }
Logger root = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
root.setLevel(Level.TRACE);
c()
}
String createLogString(int p){
println "called with $p"
return "blah: $p"
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在创建闭包时log.traceEnabled
为 false,但是当执行闭包时,情况发生了变化。
输出是:
called with 1
16:53:15.408 [main] INFO TestCode - blah: 1
called with 3
16:53:15.414 [main] TRACE TestCode - blah: 3
Run Code Online (Sandbox Code Playgroud)
请注意,第二个TRACE
仍未打印:-)