I have configured log4j appenders in my application to send mails in case of any exception.
Code looks like this in 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
}
}
}
I want to include in subject, the current login user from whose screen error originates. I am using spring security plugin and grails version is 1.3.7
I have the following code:
def user
grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
user = org.abc.com.Person.get(appCtx.springSecurityService.currentUser.id)
}
outside log4j and used user instance in subject but it returns null.
Is their any other way to get current user in subject.
Any way to do so? Please suggest
Also is their any way to send mail asynchronously?
Based on the pointer from Joshua , I found an awesome blog entry by Burt on the same problem.
http://burtbeckwith.com/blog/?p=521
It is the exact answer for the problem , I was looking for.