8

当您创建一个新的 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, [])

4

4 回答 4

0

改变

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

logger("grails.app", INFO, ['FULL_STACKTRACE'], false)

将 grails-app 中的所有日志写入 stacktrace.log

于 2016-09-04T12:20:25.513 回答
0

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

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

是的,无论记录器名称如何,logback 都可以工作。

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

确实如此。我无法重现它没有的场景。如果可以,请在https://github.com/grails/grails-core/issues提交问题并包含示例应用程序,我们将对其进行整理。

很抱歉给您带来麻烦,并感谢您的反馈。

于 2020-01-06T19:52:01.207 回答
0

您在 Bootstrap.groovy 中的日志语句:

log.error 'this is a new error'

将常规 ERROR 级别消息记录到名为 的记录器grails.app.init.yourapp.BootStrap。它不会记录到名为 的记录器StackTraceFULL_STACKTRACEappender 用于未过滤的堆栈跟踪。这些是由框架写入记录器的StackTrace

如果你更换

log.error 'this is a new error'

throw new RuntimeException("foo")

您将看到完整的堆栈跟踪记录到 stacktrace.log

于 2016-11-25T14:14:45.750 回答
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

在 BootStrap.groovy...

class BootStrap {

    def init = { servletContext ->
        log.error 'this is a new error'
    }
    def destroy = {
    }
}

该错误显示在stacktrace.log.

编辑解决新问题:

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

是的。

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

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

于 2016-04-19T16:53:24.233 回答