Grails 用于发送log4j错误的自定义电子邮件附加程序,不返回完整的stacktrace

Grails 用于发送log4j错误的自定义电子邮件附加程序,不返回完整的stacktrace,grails,logging,groovy,log4j,Grails,Logging,Groovy,Log4j,我正在编写我自己的CustomEmailAppender,以便为生成的错误发送电子邮件 代码如下所示: class CustomEmailAppender extends AppenderSkeleton { def ctx = ApplicationHolder.getApplication().getMainContext() def mailService = ctx.getBean('mailService') def springSecurityService = c

我正在编写我自己的CustomEmailAppender,以便为生成的错误发送电子邮件

代码如下所示:

class CustomEmailAppender extends AppenderSkeleton {
   def ctx = ApplicationHolder.getApplication().getMainContext()
   def mailService = ctx.getBean('mailService')
   def springSecurityService = ctx.getBean('springSecurityService')
   def executorService = ctx.getBean('executorService')


  public static void register() {
    CustomEmailAppender appender = new CustomEmailAppender()
    Logger.getRootLogger().addAppender(appender)
    Logger.getLogger("StackTrace").addAppender(appender)
  }

/**
 * Constructor with default values.
 */
    public CustomEmailAppender() {
      setThreshold(Level.ERROR)
      setLayout(new PatternLayout("%c{2} %m%n"))
    }

/**
 * {@inheritDoc}
 */
 @Override
    public void append(final LoggingEvent event) {

      if (!event.getLevel().isGreaterOrEqual(Level.ERROR)) {
          return
       }

      event.getThreadName()
      event.getNDC()
      event.getMDCCopy()
      sendErrorEmail(layout.format(event))
    }

/**
 * {@inheritDoc}
 * @see org.apache.log4j.AppenderSkeleton#close()
 */
  public synchronized void close() {
      closed = true
  }

/**
 * {@inheritDoc}
 * @see org.apache.log4j.AppenderSkeleton#requiresLayout()
 */
  public boolean requiresLayout() {
      return true
  }

  void sendErrorEmail(String errorLogs) {
      println "errorLogs.." + errorLogs
  }
}
此处errorLogs仅返回log.error消息,而不是完整的stacktrace

我希望通过电子邮件发送完整的stacktrace

有人能告诉我需要对上述代码进行哪些增强才能获得 在errorLogs参数中完成stacktrace


有指针吗?

从上面的sendErrorEmail方法传递事件参数&&在中使用以下代码

    void sendErrorEmail(LoggingEvent event) {
    StringBuffer buffer = new StringBuffer()
    String header = layout.getHeader()
    if(header != null){
        buffer.append(header)
    }
    buffer.append(layout.format(event))
    if(layout.ignoresThrowable()) {
        String[] s = event.getThrowableStrRep()
        if (s != null) {
            for (int j = 0; j < s.length; j++) {
                buffer.append(s[j])
                buffer.append(Layout.LINE_SEP);
            }
        }
    }
    String footer = layout.getFooter()
    if (footer != null) {
        buffer.append(footer)
    }
}
无效发送错误电子邮件(记录事件){
StringBuffer=新的StringBuffer()
String header=layout.getHeader()
if(标题!=null){
buffer.append(头)
}
buffer.append(layout.format(事件))
if(layout.ignorestrowable()){
字符串[]s=event.getThrowableStrRep()
如果(s!=null){
对于(int j=0;j
buffer Variable将返回完整的堆栈跟踪