Grails 为什么Logback/Slf4j在Groovy中记录错误的文件和行号?
我注意到有时候Logback/Slf4j会在Groovy中记录错误的文件和行号 我的Grails应用程序中有很多错误的文件/行号日志(占所有日志的50%以上) 有什么解决办法吗 最简单的例子: logback.groovyGrails 为什么Logback/Slf4j在Groovy中记录错误的文件和行号?,grails,groovy,logback,Grails,Groovy,Logback,我注意到有时候Logback/Slf4j会在Groovy中记录错误的文件和行号 我的Grails应用程序中有很多错误的文件/行号日志(占所有日志的50%以上) 有什么解决办法吗 最简单的例子: logback.groovy appender("STDOUT", ConsoleAppender) { encoder(PatternLayoutEncoder) { pattern = '%d{HH:mm:ss.SSS} [%-5level] %msg \\(%file:%li
appender("STDOUT", ConsoleAppender) {
encoder(PatternLayoutEncoder) {
pattern = '%d{HH:mm:ss.SSS} [%-5level] %msg \\(%file:%line\\)%n'
}
}
root(DEBUG, ["STDOUT"])
@Slf4j
class Test {
static void main(String[] args) {
log.info("${'Wrong file and line number!'}")
}
}
Test.groovy
appender("STDOUT", ConsoleAppender) {
encoder(PatternLayoutEncoder) {
pattern = '%d{HH:mm:ss.SSS} [%-5level] %msg \\(%file:%line\\)%n'
}
}
root(DEBUG, ["STDOUT"])
@Slf4j
class Test {
static void main(String[] args) {
log.info("${'Wrong file and line number!'}")
}
}
输出
23:24:23.894 [INFO ] 0 Wrong file and line number! (NativeMethodAccessorImpl.java:-2)
我的grails日志输出有问题的示例
10:16:44.881 [DEBUG] [org.grails.plugin.resource.ResourceProcessor] -------------------------------------------------- (null:-1)
记录
GString
时会出现问题(任何正常字符串都记录正确的行号)。我不知道为什么它会这样工作,但我发现了两种解决方法:要么通过调用toString()
方法(丑陋)将GString
转换为String
,要么使用带参数的模板格式
import groovy.util.logging.Slf4j;
@Slf4j
class Test {
static void main(String[] args) {
def x = 1
log.info("Does not work: ${x}")
log.info("Works ${x}".toString())
log.info("Works {}", x)
}
}
可能logback的%file和%line方法会偷偷预览stackframe并使用它,因为groovy中的log.info将嵌入动态调度中,而动态调度将解析为使用NativeMethodAccessorImpl。因此,可能%文件和%行在Groovy中不起作用。