当您创建一个新的 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 )
但是,遵循这种方法不会导致错误输出到 stacktrace.log 文件。
@JeffScottBrown 的答案包含以下 Bootstrap.groovy 文件,用于测试堆栈跟踪是否按预期记录:
class BootStrap {
def init = { servletContext ->
log.error 'this is a new error'
}
def destroy = {
}
}
使用该引导文件,运行 grails 应用程序不会产生任何输出到build/stacktrace.log
.
如果您删除StackTrace
记录器,并添加FULL_STACKTRACE
到根记录器:
root(ERROR, ['STDOUT', 'FULL_STACKTRACE']
您将在 stacktrace.log 中获得输出。
或者,将StackTrace
记录器重命名为grails.app.init.Bootstrap
(感谢@JeffScottBrown 的这一行):
logger 'grails.app.init.BootStrap', ERROR, ['FULL_STACKTRACE'], false
你会得到输出到stacktrace.log
这个观察让我相信StackTrace
记录器没有做任何事情。我进一步被引导相信任何没有为包命名的记录器都不起作用。
由于这一切,我的问题是:
- logback 是否适用于非包/类命名的记录器?
- 如果是这样,为什么
StackTrace
默认的记录器logback.groovy
不会输出到stacktrace.log?
编辑:
- 对我来说主要问题是
StackTrace
记录器似乎完全没有必要,那么为什么它包含在默认文件中?
第二次编辑:
确认这一点的另一种方法是仅让StackTrace
记录器写入STDOUT
附加程序,并在您抛出异常时观察堆栈跟踪从控制台消失:
logger("StackTrace", ERROR, ['STDOUT','FULL_STACKTRACE'], false)
root(ERROR, [])