Cloudwatch无法解析含多个JSON对象的多行日志,如何保留为单条日志?
解决.NET Core API多行日志在AWS CloudWatch中被拆分为多条条目的方案
- 方案1:修改CloudWatch Agent配置,开启多行合并(无业务侵入,推荐)
CloudWatch Agent支持通过multi_line_start_pattern参数自定义日志条目起始规则,只要配置正则匹配你日志固定的行首格式即可,所有未匹配到行首规则的内容都会自动合并到上一条日志中。该方案不需要修改任何业务代码,对运行中的服务无侵入,适配你当前的混合格式日志需求。
配置示例(CloudWatch Agent配置文件中logs段):
{ "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/var/your-product-api/logs/*.log", "log_group_name": "product-api-log-group", "log_stream_name": "{instance_id}", "multi_line_start_pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}\\|" } ] } } } }
上述正则会匹配你日志开头的年-月-日 时:分:秒.毫秒|格式,完全适配你现有日志结构,配置后重启CloudWatch Agent即可生效。
- 方案2:修改.NET Core日志输出规则,转义换行符
如果不方便调整Agent配置,可以在日志输出层将所有换行符\r\n、\n转义为\\n,让整条日志变为单行格式,自然不会被CloudWatch拆分,同步到DataDog后会自动识别转义换行符还原排版,不影响日志可读性。 - 方案3:调整日志为纯JSON结构
你可以直接将日志的时间、级别、自定义消息、异常栈等所有内容封装为单个JSON对象输出,单条JSON结构天然不会被CloudWatch拆分,同时同步到DataDog后还支持字段级别的检索和过滤,后续排查问题效率更高。
内容的提问来源于stack exchange,提问作者peter.swallow
相关产品推荐
相关产品推荐

