Почему Logback/Slf4j регистрирует неправильные номера файлов и строк в Groovy?

Я заметил, что иногда 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"])

Test.groovy

@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)

Ответ 1

Проблема возникает, когда записывается GString (любой нормальный String регистрирует правильный номер строки). Я не знаю, почему это работает так, но я нашел два обходных пути: либо конвертируйте GString в String, вызвав метод toString() (уродливый), либо используйте формат шаблона с параметрами

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)
    }
}