我的多行日志记录事件都会导致多事件 - 每行一个事件。根据{{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。这似乎适用于我的代码生成的消息。记录到处的堆栈跟踪仍然是个问题。
[编辑] 我一直在使用两种解决方法:
将'\ n'替换为'\ r'。对于堆栈跟踪,我创建了一个实用程序方法(这是在Kotlin中,但这个想法很通用):
fun formatThrowable(t: Throwable): String {
val buffer = StringWriter()
t.printStackTrace(PrintWriter(buffer))
return buffer.toString().replace("\n", "\r")
}
我认为从长远来看,一个更理想的解决方案是Appender
实现装饰ConsoleAppender
,它将对所有通过的消息进行\r
替换。
答案 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 的合著者和博客的作者。