我们正在将应用日志从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时,如何启用多行?
答案 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());
}