我已在我的应用程序中配置了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。
他们是否有其他方式让当前用户进入主题。
有没有办法这样做?请建议
他们是以异步方式发送邮件的任何方式吗?
答案 0 :(得分:2)
答案 1 :(得分:1)
这里的关键是使用log4j嵌套诊断上下文。 log4j的documentation概述了您的用例。
为了说明这一点,让我们以servlet为例 向众多客户提供内容。 servlet可以构建NDC 在执行其他代码之前的请求的最开始。该 上下文信息可以是客户端的主机名和其他信息 请求固有的信息......
将其翻译成Grails并不太难。创建一个适用于所有请求的过滤器,使用适当的信息填充NDC before
对任何控制器和操作的调用,然后清除after
呼叫。
在NDC中公开此信息后,您当然可以将其添加到日志记录模式中。
这是解决此问题的正确方法。