当您创建新的 grails 应用程序时,默认的 logback.groovy 文件(以及几乎每个 logback.groovy 示例,甚至哈基先生的例子 http://mrhaki.blogspot.com/2015/09/grails-goodness-use-different-logging.html)包含以下代码,我已将其简化以专注于相关部分:
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?
EDIT:
- 对我来说主要问题是
StackTrace
logger 似乎完全没有必要,那么为什么它包含在默认文件中呢?
第二次编辑:
确认这一点的另一种方法是仅使StackTrace
记录器写入STDOUT
附加程序,并在抛出异常时观察堆栈跟踪从控制台消失:
logger("StackTrace", ERROR, ['STDOUT','FULL_STACKTRACE'], false)
root(ERROR, [])