Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails中的自定义日志级别_Grails_Logging_Smtpappender - Fatal编程技术网

Grails中的自定义日志级别

Grails中的自定义日志级别,grails,logging,smtpappender,Grails,Logging,Smtpappender,我希望在Grails2.2.4应用程序中出现未捕获的异常时得到通知。Log4j有一个SMTPAppender做类似的事情,但只基于特定的日志级别。在我的应用程序中,在所有可用的日志级别中已经有很多日志条目,因此在出现错误或致命错误时发送电子邮件实际上不是一个选项,因为它还将包含非异常条目 过滤Grails中未捕获的异常非常简单,我只是将它们重定向到特定的控制器并在那里处理: static mappings = { [...] "500"(controller: "errors",

我希望在Grails2.2.4应用程序中出现未捕获的异常时得到通知。Log4j有一个SMTPAppender做类似的事情,但只基于特定的日志级别。在我的应用程序中,在所有可用的日志级别中已经有很多日志条目,因此在出现错误或致命错误时发送电子邮件实际上不是一个选项,因为它还将包含非异常条目

过滤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文档说明了如何添加自定义附加器,但没有说明自定义级别(或者我错过了?!)


有什么建议吗?

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。它现在很有魅力