自定义电子邮件Appender用于发送log4j错误而不返回完整的堆栈跟踪

时间:2014-08-28 09:55:50

标签: grails logging groovy log4j

我正在编写自己的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消息,而不是完整的堆栈跟踪。

我希望通过电子邮件发送完整的堆栈跟踪。

任何人都可以告诉我我需要对上面的代码做些什么更多的改进才能获得 在errorLogs参数中完成堆栈跟踪。

任何指针?

1 个答案:

答案 0 :(得分:5)

从上面的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)
    }
}

缓冲区变量将返回完整的堆栈跟踪。