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记录器没有做任何事情.我进一步认为任何没有为包命名的记录器都不起作用.
由于这一切,我的问题是:
StackTrace默认情况下的记录器logback.groovy不会导致输出到stacktrace.log?StackTrace记录器似乎完全没必要,为什么它包含在默认文件中?确认这一点的另一种方法是只使StackTrace记录器写入STDOUTappender,并在抛出异常时观察stacktraces从控制台中消失:
logger("StackTrace", ERROR, ['STDOUT','FULL_STACKTRACE'], false)
root(ERROR, [])
我希望您没有将附加程序配置为正确使用。
以下作品:
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。