【问题标题】:Why Logback/Slf4j logs wrong file and line numbers in Groovy?为什么 Logback/Slf4j 在 Groovy 中记录错误的文件和行号?
【发布时间】:2013-11-11 22:30:01
【问题描述】:

我注意到有时 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)

【问题讨论】:

  • 也许 logback 的 %file 和 %line 方法会偷偷预览堆栈帧并使用它?因为 groovy 中的 log.info 将嵌入动态调度中,这解决了使用NativeMethodAccessorImpl。所以也许 %file 和 %line 在 Groovy 中不起作用。

标签: grails groovy logback


【解决方案1】:

当记录GString 时会出现问题(任何正常的String 记录正确的行号)。我不知道为什么它会这样工作,但我找到了两种解决方法:通过调用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)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 2012-03-15
    • 1970-01-01
    • 2017-05-06
    • 2020-08-07
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多