grails - 用于发送不返回完整堆栈跟踪的 log4j 错误的自定义电子邮件附加程序

标签 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 参数中的完整堆栈跟踪。

任何指针?

最佳答案

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

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

关于grails - 用于发送不返回完整堆栈跟踪的 log4j 错误的自定义电子邮件附加程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25545893/

相关文章:

Grails Geocode 插件依赖注入(inject)问题

grails - Grails-带有pdf附件的RESTful Web服务?

validation - Grails供稿-插件,<pubDate> && <dc:date>,验证错误

用于 CustomClass 和数字/字符串的 Groovy CompareTo

运行 'grails tomcat deploy' 时出现 java.io.IOException

logging - 什么时候应该使用 logInfo,什么时候应该使用 writeln?

java - 停止 log4j2 记录器初始化日志打印到标准输出

logging - 如何设置已部署的 eclipse RCP 应用程序的调试选项?

java - 为什么Tomcat跑了一周左右,创建1对2的int数组突然变成了慢瓶颈?

java - 使用 Shiro 通过 LDAP 对用户进行身份验证