为什么Logback/Slf4j在Groovy中记录错误的文件和行号?

Mic*_*d a 10 grails groovy logback

我注意到有时Logback/Slf4j在Groovy中记录错误的文件和行号.

我的Grails应用程序中有很多错误的文件/行号日志(超过所有日志的50%)

有没有解决方法?

最简单的例子:

logback.groovy

appender("STDOUT", ConsoleAppender) {
    encoder(PatternLayoutEncoder) {
        pattern = '%d{HH:mm:ss.SSS} [%-5level] %msg \\(%file:%line\\)%n'
    }
}

root(DEBUG, ["STDOUT"])
Run Code Online (Sandbox Code Playgroud)

Test.groovy

@Slf4j
class Test {
    static void main(String[] args) {
        log.info("${'Wrong file and line number!'}")
    }
}
Run Code Online (Sandbox Code Playgroud)

产量

23:24:23.894 [INFO ] 0 Wrong file and line number! (NativeMethodAccessorImpl.java:-2)
Run Code Online (Sandbox Code Playgroud)

我的grails日志输出示例有问题

10:16:44.881 [DEBUG] [org.grails.plugin.resource.ResourceProcessor] -------------------------------------------------- (null:-1)
Run Code Online (Sandbox Code Playgroud)

Ger*_*oth 1

GString当记录a 时会出现问题(任何正常的String记录都会记录正确的行号)。我不知道为什么它会这样工作,但我找到了两种解决方法:要么通过调用方法(丑陋)GString进行转换,要么使用带参数的模板格式StringtoString()

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)
    }
}
Run Code Online (Sandbox Code Playgroud)