【问题标题】:How does multi-line logging work in Lambda -> CloudWatch多行日志记录如何在 Lambda -> CloudWatch 中工作
【发布时间】:2018-05-06 20:36:58
【问题描述】:

我的多行日志记录事件都以多事件结尾 - 每行一个事件。根据documentation

对 LambdaLogger.log() 的每次调用都会导致 CloudWatch Logs 事件...

然后:

但是,请注意 AWS Lambda 会处理 System.out 返回的每一行 和 System.err 作为一个单独的事件。

查看LambdaAppender's source code 内部,它似乎继续将事件记录到System.out。那么这是否意味着多行消息总是会被分解为多个事件?

我已阅读有关配置 multi_line_start_pattern 的信息,但这似乎仅适用于您部署日志代理时,无法在 Lambda 中访问。

[编辑]LambdaAppender 记录到LambdaLogger,后者记录到System.out

[编辑] 我发现了一些建议解决方法的帖子 - 在打印消息时使用 '\r' 作为 eol。这似乎适用于我的代码产生的消息。随处记录的堆栈跟踪仍然是个问题。

[编辑] 我一直在使用两种解决方法

  1. 以 JSON 格式记录复杂的数据结构(例如,相当大的地图)。 CloudWatch 实际上可以识别日志事件中的 JSON 字符串,并漂亮地打印出来。
  2. 将“\n”替换为“\r”。对于堆栈跟踪,我创建了一个实用方法(这是在 Kotlin 中,但这个想法足够通用):

    fun formatThrowable(t: Throwable): String {
        val buffer = StringWriter()
        t.printStackTrace(PrintWriter(buffer))
        return buffer.toString().replace("\n", "\r")
    }
    

我认为从长远来看,更理想的解决方案是使用 Appender 实现来装饰 ConsoleAppender,这将对所有通过的消息进行 \r 替换。

【问题讨论】:

  • 你在哪里看到它写信给System.out?因为我看到它写入 LambdaLogger 实例,这是非分布式 AWS 运行时代码的一部分。
  • 如果我没看错,LambdaLogger 源实际上在同一个项目中:github.com/aws/aws-lambda-java-libs/blob/master/…
  • 您当然似乎是正确的——在发表评论之前,我没有花时间查看 repo 中的其他项目。但是,我知道(或至少相信)我看到一个异常记录在与主要消息相同的 CloudWatch 事件中。这让我想知道 System.out 是否可能是 AWS 特定的 PrintStream,它基于写入而不是换行进行刷新。这完全是我的猜测,但很容易通过 (1) Class.getName() 和 (2) 打印带有嵌入换行符的字符串来验证。

标签: amazon-web-services logging aws-lambda amazon-cloudwatch amazon-cloudwatchlogs


【解决方案1】:

最佳做法是在日志中使用 json。与其发送多行输出,不如发送一个格式化的 json(无论您使用哪种语言,您都会找到一个已经为您执行此操作的库)

您会惊讶于从那里浏览您的日志是多么容易。例如,aws cloudwatch insights 自动检测您的字段,它允许在几秒钟内解析和查询它们

【讨论】:

    【解决方案2】:

    我建议使用项目slf4j-simple-lambda 并参考这个blog 以获得更多解释。

    使用 slf4j 和 slf4j-simple-lambda 可以优雅地解决您的问题,并且解决方案保持轻量级。该项目包括使用参数org.slf4j.simpleLogger.newlineMethod 来解决这个问题。默认情况下,它的值为 auto 并且应该能够自动检测是否需要手动换行处理。

    Discloser:我是 slf4j-simple-lambda 的合著者和博客的作者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-05
      • 2017-01-05
      • 2020-06-25
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      相关资源
      最近更新 更多