Grails中的自定义日志级别

时间:2014-10-15 15:13:24

标签: grails logging smtpappender

我希望在我的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文档说明了如何添加自定义appender,但没有关于自定义级别(或者我是否想念它?)

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

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

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

println log.name

在我知道运行的方法中,并通过任何控制器动作间接调用该方法。例如,如果我想知道FractalService的记录器,请将该代码放在其graphJuliaSet方法中,并使用此服务调用图形化Julia Sets的控制器操作。

Log4j记录器是单件,如果您访问记录器并进行更改,将会影响以后的所有呼叫。

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

String name = ... // the name from the println above
Logger logger = Logger.getLogger(name)