为什么stacktrace.log没有在grails 3中填充logback?

Rya*_*ote 7 grails logback logback-groovy

当你创建一个新的grails应用程序时,默认的logback.groovy文件(几乎每个logback.groovy 的例子,甚至是Haki先生的例子)都包含以下代码,我已将其简化为关注相关部分:

root(ERROR, ['STDOUT'])

appender("FULL_STACKTRACE", FileAppender) {
    file = "build/stacktrace.log"
    append = true
    encoder(PatternLayoutEncoder) {
        pattern = "%level %logger - %msg%n"
    }
}
logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false )
Run Code Online (Sandbox Code Playgroud)

但是,遵循此方法不会导致错误输出到stacktrace.log文件.

@ JeffScottBrown的答案包含以下Bootstrap.groovy文件,用于测试堆栈跟踪是否按预期记录:

class BootStrap {

    def init = { servletContext ->
        log.error 'this is a new error'
    }
    def destroy = {
    }
}
Run Code Online (Sandbox Code Playgroud)

使用该引导文件,运行grails应用程序将不会产生任何输出build/stacktrace.log.

如果删除StackTrace记录器,则添加FULL_STACKTRACE到根记录器:

root(ERROR, ['STDOUT', 'FULL_STACKTRACE']
Run Code Online (Sandbox Code Playgroud)

您将获得输出到stacktrace.log.

或者,将StackTrace记录grails.app.init.Bootstrap器重命名为(感谢此行的@JeffScottBrown):

logger 'grails.app.init.BootStrap', ERROR, ['FULL_STACKTRACE'], false
Run Code Online (Sandbox Code Playgroud)

您将获得输出到stacktrace.log

这一观察让我相信StackTrace记录器没有做任何事情.我进一步认为任何没有为包命名的记录器都不起作用.

由于这一切,我的问题是:

  • logback是否适用于非包/类命名记录器?
  • 如果是这样,为什么StackTrace默认情况下的记录器logback.groovy不会导致输出到stacktrace.log?

编辑:

  • 对我来说主要的问题是StackTrace记录器似乎完全没必要,为什么它包含在默认文件中?

第二编辑:

确认这一点的另一种方法是只使StackTrace记录器写入STDOUTappender,并在抛出异常时观察stacktraces从控制台中消失:

logger("StackTrace", ERROR, ['STDOUT','FULL_STACKTRACE'], false) root(ERROR, [])

Jef*_*own 0

我希望您没有将附加程序配置为正确使用。

以下作品:

import grails.util.BuildSettings
import grails.util.Environment

// See http://logback.qos.ch/manual/groovy.html for details on configuration
appender('STDOUT', ConsoleAppender) {
    encoder(PatternLayoutEncoder) {
        pattern = "%level %logger - %msg%n"
    }
}

root(ERROR, ['STDOUT'])

def targetDir = BuildSettings.TARGET_DIR
if (Environment.isDevelopmentMode() && targetDir) {
    appender("FULL_STACKTRACE", FileAppender) {
        file = "${targetDir}/stacktrace.log"
        append = true
        encoder(PatternLayoutEncoder) {
            pattern = "%level %logger - %msg%n"
        }
    }
    logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false)
}

logger 'grails.app.init.BootStrap',
        ERROR, ['FULL_STACKTRACE'], false
Run Code Online (Sandbox Code Playgroud)

在 BootStrap.groovy 中...

class BootStrap {

    def init = { servletContext ->
        log.error 'this is a new error'
    }
    def destroy = {
    }
}
Run Code Online (Sandbox Code Playgroud)

该错误出现在stacktrace.log.

编辑解决新问题:

logback 是否适用于非包/类命名的记录器?

是的。

如果是这样,为什么默认 logback.groovy 中的 StackTrace 记录器不会输出到 stacktrace.log?

StackTrace 记录器确实会导致与相应附加程序关联的所有记录器的输出写入 stacktrace.log。