在Lambda – > CloudWatch中,多行日志记录如何工作?

我的多行日志记录事件最终都是多事件 – 每行一个事件。 根据文件 :

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

但是之后:

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

看看LambdaAppender的源代码 ,看来它仍然会将事件记录到System.out 。 那么这是否意味着多线消息将总是被分解成多个事件?

我已经阅读了有关配置multi_line_start_pattern的内容 ,但似乎只适用于部署日志代理,而这在Lambda中是不可访问的。

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

[编辑]我find了一些建议解决方法的post – 在打印邮件时使用“\ r”作为eol。 这似乎适用于我的代码产生的消息。 堆栈跟踪记录到处都是一个问题。

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

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

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

我认为从长远来看,一个更理想的解决方案将是装饰ConsoleAppenderAppender实现,它将对所有通过的消息进行替换。