AWS将多行日志文件从CloudWatch流式传输到ELK

时间:2018-11-09 22:13:35

标签: amazon-web-services elastic-stack amazon-cloudwatch amazon-elasticsearch

我们正在将应用日志从CloudWatch流式传输到AWS ELK。我们的微服务是用Java编写的,因此我仅关注这些内容。记录时的典型Java异常堆栈跟踪如下所示:

Exception in thread "main" java.lang.NullPointerException
    at com.example.myproject.Book.getTitle(Book.java:16)
    at com.example.myproject.Author.getBookTitles(Author.java:25)
    at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

通常,这将被逐行提取到ELK堆栈中,这会破坏整个消息。

通常,要使整个堆栈跟踪作为一条消息被提取,可以在Logstash或Filebeat中配置 multiline 插件。

有什么想法,当AWS lambda将日志文件从CloudWatch流到ELK时,如何启用多行?

1 个答案:

答案 0 :(得分:1)

事实证明,这是AWS cloudwatch记录器的一个已知问题,请参阅https://github.com/visionmedia/debug/issues/296上的RichardBronosky的评论

  

我做了一些测试,发现CloudWatch日志条目可以做成多行   通过使用\r作为行定界符。使用\n(Unix)或\r\n(DOS)行   结尾将产生单独的条目

因此,我通过在Spring Boot ExceptionHandler中添加以下RestController来修复它

@ExceptionHandler(Throwable.class)
void handleUnhandledExceptions(Throwable e, HttpServletResponse response) throws IOException {
    StringWriter buffer = new StringWriter();
    e.printStackTrace(new PrintWriter(buffer));
    log.error(buffer.toString().replace("\n", "\r"));
    response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
} 
相关问题