【发布时间】:2016-08-11 22:06:01
【问题描述】:
当您创建一个新的 grails 应用程序时,默认的 logback.groovy 文件(以及几乎每个 logback.groovy 示例,甚至是 Mr Haki's example)都包含以下代码,我已对其进行了简化以专注于相关部分:
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 是否适用于非包/类命名的记录器?
- 如果是这样,为什么默认
logback.groovy中的StackTrace记录器不会导致输出到 stacktrace.log?
编辑:
- 对我来说主要问题是
StackTrace记录器似乎完全没有必要,那么为什么将它包含在默认文件中?
第二次编辑:
确认这一点的另一种方法是仅让 StackTrace 记录器写入 STDOUT 附加程序,并在您抛出异常时观察堆栈跟踪从控制台消失:
logger("StackTrace", ERROR, ['STDOUT','FULL_STACKTRACE'], false)
root(ERROR, [])
【问题讨论】:
-
这是与 Grails 3.1.0.RC2 一起使用的。我会尝试在某个时候使用更高版本进行测试。
-
它有效。检查 grails 项目的
build目录。 -
@Kowser 有什么用?你是说你的 logback.groovy 只有一个使用
FULL_STACKTRACEappender 的记录器,即StackTrace记录器定义为:logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false )?如果您有任何其他使用FULL_STACKTRACE的记录器,那么您将绕过我认为无用的行。
标签: grails logback logback-groovy