我的多行日志事件最终都变成了多个事件 - 每行一个事件。根据文档:
我已经了解了如何配置multi_line_start_pattern,但它似乎只适用于您部署日志代理时,而在Lambda中不可用。
[编辑]
[编辑] 我发现一些帖子提出了解决方法 - 在打印消息时使用 '\r' 作为行末。这似乎适用于我的代码生成的消息。但在各个地方记录的堆栈跟踪仍然是一个问题。
[编辑] 我已经使用了两个解决方法:
但是:每次调用 LambdaLogger.log() 都会产生 CloudWatch Logs 事件...
查看LambdaAppender 的源代码,它似乎仍然将事件记录到但请注意,AWS Lambda 将 System.out 和 System.err 返回的每一行视为单独的事件。
System.out
中。那么这是否意味着多行消息总是会被分解为多个事件?我已经了解了如何配置multi_line_start_pattern,但它似乎只适用于您部署日志代理时,而在Lambda中不可用。
[编辑]
LambdaAppender
记录到 LambdaLogger
,该对象记录到 System.out
。[编辑] 我发现一些帖子提出了解决方法 - 在打印消息时使用 '\r' 作为行末。这似乎适用于我的代码生成的消息。但在各个地方记录的堆栈跟踪仍然是一个问题。
[编辑] 我已经使用了两个解决方法:
- Log complex data structures (e.g. sizable maps) in JSON. CloudWatch actually recognizes JSON strings in log events, and pretty print them.
Replace '\n' with '\r'. For stack traces I created a utility method (this is in Kotlin, but the idea is generic enough):
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 运行时代码的一部分。 - kdgregoryLambdaLogger
的源代码实际上在同一个项目中:https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/LambdaRuntime.java。 - jingxSystem.out
是否是一种AWS特定的PrintStream
,它基于写入而不是换行符进行刷新。这完全是我猜测的,但可以通过以下方式轻松验证:(1)使用Class.getName()
和(2)打印包含换行符的字符串。 - kdgregory