多行日志记录如何在Lambda中工作 - >的CloudWatch

时间:2017-11-23 00:50:35

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

我的多行日志记录事件都会导致多事件 - 每行一个事件。根据{{​​3}}:

  

每次调用LambdaLogger.log()都会产生CloudWatch Logs事件......

然后:

  

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

查看documentation内部,似乎无论如何都会将事件记录到System.out。这是否意味着多行消息将始终分解为多个事件?

我已阅读有关配置LambdaAppender's source code的内容,但这似乎只适用于部署日志代理,而Lambda无法访问该代理。

[修改] LambdaAppender记录到multi_line_start_pattern,并记录到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")
    }
    
  3. 我认为从长远来看,一个更理想的解决方案是Appender实现装饰ConsoleAppender,它将对所有通过的消息进行\r替换。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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