0

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

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

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

我的计划是引入我自己的日志级别,并将其仅用于未捕获的异常。文档表明这一点:

final Level EXCEPTION = Level.forName("EXCEPTION", 50);
logger.log(EXCEPTION, "uncaught exception", e);

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

有什么建议么?

4

1 回答 1

2

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

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

println log.name

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

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

因此该记录器可通过以下方式获得:

String name = ... // the name from the println above
Logger logger = Logger.getLogger(name)
于 2014-10-15T18:55:47.593 回答