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

jin*_*ngx 5 logging amazon-web-services amazon-cloudwatch aws-lambda amazon-cloudwatchlogs

我的多行日志记录事件都结束了多个事件-每行一个事件。根据文档

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

但是之后:

但是,请注意,AWS Lambda将System.out和System.err返回的每一行都视为一个单独的事件。

查看LambdaAppender的源代码,看来它仍然可以继续记录该事件System.out。那么,这是否意味着多行消息将始终分解为多个事件?

我已经阅读了有关配置multi_line_start_pattern的内容,但这似乎仅适用于部署Log Agent,而该代理在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")
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

Fra*_*IAT 1

我建议使用项目slf4j-simple-lambda并参考此博客以获取更多说明。

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

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