Grails中的自定义日志级别
我希望在Grails2.2.4应用程序中出现未捕获的异常时得到通知。Log4j有一个SMTPAppender做类似的事情,但只基于特定的日志级别。在我的应用程序中,在所有可用的日志级别中已经有很多日志条目,因此在出现错误或致命错误时发送电子邮件实际上不是一个选项,因为它还将包含非异常条目 过滤Grails中未捕获的异常非常简单,我只是将它们重定向到特定的控制器并在那里处理:Grails中的自定义日志级别,grails,logging,smtpappender,Grails,Logging,Smtpappender,我希望在Grails2.2.4应用程序中出现未捕获的异常时得到通知。Log4j有一个SMTPAppender做类似的事情,但只基于特定的日志级别。在我的应用程序中,在所有可用的日志级别中已经有很多日志条目,因此在出现错误或致命错误时发送电子邮件实际上不是一个选项,因为它还将包含非异常条目 过滤Grails中未捕获的异常非常简单,我只是将它们重定向到特定的控制器并在那里处理: static mappings = { [...] "500"(controller: "errors",
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文档说明了如何添加自定义附加器,但没有说明自定义级别(或者我错过了?!)
有什么建议吗?Grails使用Slf4j和Commons日志来抽象日志程序实现,并允许从Log4j更改到另一个框架,而无需使用日志程序编辑每个文件。相反,包装器库根据请求的记录器名称和本机API提供的内容获取正确的实现实例。如果您更改实现,包装器记录器的工作方式与您的应用程序代码相同,但它们调用不同的实现记录器来执行实际的日志记录 但是在配置实现之间没有标准,因此内部Grails启动代码直接与API一起工作,以配置记录器、附加器、级别等。您也可以这样做——使用传统的Log4j记录器访问代码,通过记录器名称获取实例,使用与Grails连接的预配置记录器相同的代码。我永远记不起工件中记录器的命名约定,所以我作弊并添加了一行代码
println log.name
在我知道的方法中运行,并通过任何控制器操作间接调用该方法。例如,如果我想知道FractalService
的记录器,请将该代码放入其graphJuliaSet
方法中,并调用使用该服务设置的控制器操作
Log4j记录器是单例的,如果访问记录器并对其进行更改,将影响将来的所有调用
因此,可以通过以下方式使用记录器:
String name = ... // the name from the println above
Logger logger = Logger.getLogger(name)
谢谢Burt,我想我把我的导入搞砸了,没有一直使用log4j。它现在很有魅力