在log4j appenders中访问config.groovy中的会话用户

时间:2014-08-27 06:05:01

标签: grails groovy spring-security log4j appender

我已在我的应用程序中配置了log4j appender,以便在发生任何异常时发送邮件。

代码在 Config.groovy 中显示如下:

log4j = {
    appenders {
    String currentUrl = grails.serverURL
    String currentEnv = 'Production'
    if (Environment.isDevelopmentMode()) {
        currentEnv = 'Development'
    } else if (currentUrl.indexOf('test') > -1) {
        currentEnv = 'Testing'
    }
    console name: 'stdout', layout: pattern(conversionPattern: '[%r] %c{2} %m%n')
    // if real password is needed, please contact IT department
    def patternLayout = new PatternLayout()
    patternLayout.setConversionPattern("[%r] %c{2} %m%n")
    def mailAppender = new SMTPAppender()
    mailAppender.setSMTPUsername('a@abc.com')
    mailAppender.setSMTPPassword('password')
    mailAppender.setFrom("x@xyz.com")
    mailAppender.setTo("user@domain.com")
    mailAppender.setSubject("A log4j error has been generated in the [${currentEnv}] environment.")
    mailAppender.setSMTPHost("smtp.elasticemail.com")
    mailAppender.setSMTPPort(2525)
    mailAppender.setBufferSize(4096)
    mailAppender.setLayout(patternLayout)
    appender name: 'mail', mailAppender

    root {
        error 'stdout', 'mail'
        additivity = true
     }
   }
 }

我想在主题中包含当前登录用户的屏幕错误来源。 我使用的是spring security插件,grails版本是1.3.7

我有以下代码:

def user
grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
   user = org.abc.com.Person.get(appCtx.springSecurityService.currentUser.id)
}

在log4j之外,在subject中使用了用户实例,但它返回null。

他们是否有其他方式让当前用户进入主题。

有没有办法这样做?请建议

他们是以异步方式发送邮件的任何方式吗?

2 个答案:

答案 0 :(得分:2)

根据约书亚的指针,我发现了Burt关于同一问题的一篇很棒的博客文章。

http://burtbeckwith.com/blog/?p=521

这是问题的确切答案,我一直在寻找。

答案 1 :(得分:1)

这里的关键是使用log4j嵌套诊断上下文。 log4j的documentation概述了您的用例。

  

为了说明这一点,让我们以servlet为例   向众多客户提供内容。 servlet可以构建NDC   在执行其他代码之前的请求的最开始。该   上下文信息可以是客户端的主机名和其他信息   请求固有的信息......

将其翻译成Grails并不太难。创建一个适用于所有请求的过滤器,使用适当的信息填充NDC before对任何控制器和操作的调用,然后清除after呼叫。

在NDC中公开此信息后,您当然可以将其添加到日志记录模式中。

这是解决此问题的正确方法。