【问题标题】:AWS streaming multi-line log files from CloudWatch to ELKAWS 将多行日志文件从 CloudWatch 流式传输到 ELK
【发布时间】:2019-04-13 12:11:11
【问题描述】:

我们正在将应用程序日志从 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 时启用多行吗?

【问题讨论】:

  • 你的日志框架是什么,你有什么重新配置的选项吗?
  • 您如何将日志写入 CloudWatch?您是在 Lambda 中运行并写入其记录器,还是在容器(或 EC2)中运行并使用 CloudWatch 日志代理?如果是后者,那么您的问题很可能是那个代理,因为它会将消息分成日志中的多行。
  • @kdgregory slf4j 使用默认配置。任何建议如何配置它?我们在容器中运行应用程序并使用 CloudWatch 日志代理。是否可以告诉 CloudWatch 代理不要打破每行日志并在 sracktrace 的情况下将它们组合起来

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


【解决方案1】:

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

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

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

@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());
} 

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 2018-08-29
    • 2018-03-09
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2020-07-24
    • 2020-05-26
    • 1970-01-01
    相关资源
    最近更新 更多