为什么在 grails 3 中 stacktrace.log 没有用 logback 填充?

2023-12-26

当您创建新的 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:

  • 对我来说主要问题是StackTracelogger 似乎完全没有必要,那么为什么它包含在默认文件中呢?

第二次编辑:

确认这一点的另一种方法是仅使StackTrace记录器写入STDOUT附加程序,并在抛出异常时观察堆栈跟踪从控制台消失:

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

在 BootStrap.groovy 中...

class BootStrap {

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

该错误出现在stacktrace.log.

编辑解决新问题:

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

Yes.

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 grails 3 中 stacktrace.log 没有用 logback 填充? 的相关文章

  • 配置 logback 以遵循 Java 配置,即 Logback 的纯 Java 配置

    我只是不喜欢 Logback 的 XML 或 Groovy 配置 更喜欢用 Java 进行配置 这也是因为我将在初始化后的不同时间在运行时更改配置 似乎对 Logback 进行 Java 配置的唯一方法是进行某种初始化劫持根追加器 http
  • 使用 html 表收集提交表单中的各种数据

    我有一个 jsp 页面 其中包含一个表 分页并带有顺序列 一个搜索字段和其他基于复选框的过滤器 这样 当我单击按钮时 它会采用表格的分页 表格的顺序 搜索字段中的值以及最终的其他参数 复选框 来执行查询 目前 该表具有分页和使用标签库排序的
  • Grails 中 findAll、getAll 和 list 的区别

    使用 Grails 有多种方法可以完成同一件事 查找所有域类实例 Book findAll Book getAll Book list 检索指定 id 的域类的实例 Book findById 1 Book get 1 你什么时候使用每一个
  • 如何在grails中自定义spring security插件登录页面

    我尝试在 Spring Security Core 3 1 1 中自定义登录页面 但没有成功 我在views目录中创建了一个登录目录 并在登录目录中创建了一个auth gsp 并将我的自定义表单放在那里 这是代码
  • 带有 Grails 的 AOP

    我想在我的 Grails 项目中创建自定义日志记录注释 My code class MyService AuditLog def method1 println method1 called method2 AuditLog def met
  • Logback 附加程序将消息作为 HTTP 消息发布

    根据我的要求 我只想将 HTTP 消息发布到另一端 该消息由org slf4j LoggerFactory getLogger 以下 JSON 字符串记录在INFO level studentName My Name Deratment C
  • 我应该在 grails 应用程序中的哪里放置瞬态域类?

    我应该在 grails 应用程序中的哪里放置瞬态域类 即我有一个Action将被传递和使用但从未保存的类 这应该是在grails app domain文件夹 还是其他地方 grails app domain用于持久域类 但并非所有应用程序的
  • Grails 操作被调用两次。帮助!

    我正在编写一个 grails 应用程序并遇到一个奇怪的问题 单击页面上的提交按钮时 关联的操作会快速连续调用两次 这会导致一切都严重破坏 以前有其他人见过这个问题吗 下面是我的代码 从普惠制页面
  • 如何在 Groovy 中的 JSON Converter 方法中保留字母大小写?

    我正在尝试将 groovy 对象解析为 JSON 属性名称不遵循正确的驼峰式大小写形式 class Client String Name Date Birthdate 当我使用这个时 Client client new Client Nam
  • 如何使用 Spring Resource.groovy 正确注入 Grails 服务

    使用 Grails 2 2 1 我定义了以下 Grails 服务 package poc class TestService def helperService class HelperService 我已经用过TestService如下
  • 空白约束和空约束之间的区别

    空白约束和空约束有什么区别 我有以下课程 class Task String title String notes TekUser assignedTo Date dueDate TekEvent event static constrai
  • Spring IO 这个名字是什么意思? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 2013 年秋季 Spring 推出了新网站 spring io http spring io 并宣布了其新平台 弹簧IO http sp
  • withTransaction 和 withNewTransaction 有什么区别?

    以下动作有什么区别 def someAction User withTransaction and def someAction User withNewTransaction 我什么时候用什么 当 grails 操作仅包含 Transac
  • grails/mysql 时区更改

    完成更改应用程序时区的最佳方法是什么 在我看来 必须发生以下情况 服务器 TZ 已被系统管理员更改 mysql必须重新启动 数据库中每个基于时间的列都必须使用convert tz 或等效方法更新所有值 因此 要么必须编写一个 mysql 脚
  • Grails + Spring Security:无法登录

    我刚刚开始学习Grails和Spring 我已经按照官方教程创建了一个登录系统 但我无法登录 用户名或密码不匹配 我知道 90 的情况下这是由于双重编码或多个数据源 这也导致双重编码 造成的 但我也没有这样做 class BootStrap
  • 无法创建“DependencyManagementReportTask”类型的任务。 Gradle 新手

    我是 Grails 3 和 Gradle 的新手 我正在努力将应用程序 2 4 4 更新到 Grails 3 2 8 通过升级 我想从头开始构建一个插件 我无法使用声明依赖项的标准方法将其包含到项目中 我正在尝试使用 gradle 构建 g
  • 修改String字段的getter的返回值

    假设我的应用程序中有一些类似于域类的类 其中包含一些 Long Double Date 和 String 字段 这些类使用一些公共字段和一些公共方法扩展了基类 每当我访问 String 类字段 通过 getter 时 我想对返回的值进行一些
  • UrlMapping 和文件扩展名

    我有以下 url 映射 name a a file controller attachment action get 我想像这样使用它
  • 模块化大型 Grails 应用程序的最佳实践?

    我正在开发的 Grails 应用程序变得相当大 最好将其重构为几个模块 这样我们就不必每次都重新部署整个事情 将 Grails 应用程序拆分为多个模块的最佳实践是什么 特别是 我想创建一个域类 相关服务的包 并将其作为模块在应用程序中使用
  • 如何设置 commons-logging 来使用 logback?

    我们使用 slf4j logback 并且碰巧有一些使用 commons logging 的第三方库 如何设置它以使用 logback 答案是不要使用 commons logging jar 因为 SLF4J 的设计目的与 commons

随机推荐