gpt4 book ai didi

grails - Grails 中的自定义日志级别

转载 作者:行者123 更新时间:2023-12-02 15:06:55 24 4
gpt4 key购买 nike

当我的 Grails 2.2.4 应用程序中出现未捕获的异常时,我希望得到通知。 Log4j 有一个 SMTPAppender 做类似的事情,但仅基于特定的日志级别。在我的应用程序中,所有可用日志级别中已经有很多日志条目,因此发送关于 ERROR 或 FATAL 的电子邮件并不是一个真正的选项,因为它还包含非异常条目。

在 Grails 中过滤未捕获的异常非常容易,我只需将它们重定向到特定的 Controller 并在那里处理它:

static mappings = {
[...]
"500"(controller: "errors", action: "serverError")
}

我的计划是引入我自己的日志级别,并将其仅用于未捕获的异常。文档表明这一点:
final Level EXCEPTION = Level.forName("EXCEPTION", 50);
logger.log(EXCEPTION, "uncaught exception", e);

但我不知道如何在 Grails 中使用注入(inject)的 log目的。它只支持基本选项,如 log.error('foo',e) . Grails 文档说明了如何添加自定义附加程序,但没有关于自定义级别(或者我错过了吗?!)

有什么建议么?

最佳答案

Grails 使用 Slf4j 和 Commons Logging 来抽象记录器实现,并允许从 Log4j 更改为另一个框架,而无需使用记录器编辑每个文件。相反,包装器库会根据请求的记录器名称和 native API 可用的内容获取正确的实现实例。如果您更改实现,包装记录器的工作方式与您的应用程序代码相同,但它们调用不同的实现记录器来执行实际记录。

但是配置实现之间没有标准,因此内部 Grails 启动代码直接使用 API 来配置记录器、附加器、级别等。您可以这样做 - 使用传统的 Log4j 记录器访问代码通过记录器名称获取实例,使用与连接的预配置记录器 Grails 相同的记录器。我永远记不起工件中记录器的命名约定,所以我作弊并添加了一行代码

println log.name

在我知道运行的方法中,并通过可以到达那里的任何 Controller 操作间接调用该方法。例如,如果我想知道 FractalService 的记录器,将该代码放入其 graphJuliaSet方法并调用使用此服务绘制 Julia 集的 Controller 操作。

Log4j 记录器是单例的,如果您访问记录器并更改它,这将影响所有 future 的调用。

因此该记录器可通过以下方式获得:
String name = ... // the name from the println above
Logger logger = Logger.getLogger(name)

关于grails - Grails 中的自定义日志级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26386024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com