如何通过FluentBit将ECS Fargate日志结构化推送到New Relic?
如何将ECS Fargate中FluentBit收集的非结构化日志转为结构化推送至New Relic?
问题描述
我在ECS Fargate的Docker部署架构中,用FluentBit作为sidecar容器将服务日志推送到New Relic。当前日志内容如下(包含ANSI颜色控制码):
[37m[Info] 2022-12-9T09:08:15.346, isRequestSuccess: False, totalTime: 2603, category: <Category>, callerIpAddress: <IP address>, timeGenerated: 12/09/2022 09:08:15, region: QA, correlationId: fecdafdb-c6af-41ac-a653-ecabbc682392, method: GET, url: <Request URL>, backendResponseCode: 503, responseCode: 503, responseSize: 370, cache: none, backendTime: 1600, apiId: <API Id>, operationId: HealthCheck, productId: <Product Id>, clientProtocol: HTTP/1.1, backendProtocol: HTTP/1.1, apiRevision: 1, clientTlsVersion: 1.2, backendMethod: GET, backendUrl: <Bakend URL>, correlationId: fecdafdb-c6af-41ac-a653-ecabbc682392[0m
该日志以非结构化形式存储,导致无法在New Relic中对特定字段(如responseCode、correlationId)进行精准查询。我的FluentBit配置仅包含输出段:
[OUTPUT] name nrlogs match * license_key <license-key> base_uri <host>
我尝试过几款New Relic内置解析器,但都没能解决结构化解析的问题。
解决方案
要实现日志结构化,需要在FluentBit的配置中添加过滤阶段,先清理日志中的干扰内容(如ANSI颜色码),再将键值对格式的日志解析为结构化字段,最后推送到New Relic。
步骤1:添加日志清理过滤(移除ANSI颜色码)
使用sed过滤插件去掉日志开头的[37m和结尾的[0m这类ANSI控制码:
[FILTER] name sed match * regex \[(\d+)m(.*)\[0m replacement $2
步骤2:配置键值对解析器
在FluentBit配置中定义两个parser,分别拆分日志头部信息和键值对字段:
# 解析日志级别、时间戳和剩余字段块 [PARSER] name keyvalue_parser format regex regex ^\[(?<log_level>[^\]]+)\] (?<timestamp>[^,]+),\s*(?<fields>.*)$ time_key timestamp time_format %Y-%m-%dT%H:%M:%S.%L # 解析键值对格式的字段块 [PARSER] name keyvalue_fields format key_value delimiter , kv_delimiter : trim_key " \t" trim_value " \t"
步骤3:添加解析过滤
先用第一个解析器拆分日志级别、时间戳和剩余字段,再用键值对解析器拆分剩余字段为独立结构化字段:
[FILTER] name parser match * parser keyvalue_parser reserve_data false preserve_key true [FILTER] name parser match * parser keyvalue_fields key_name fields reserve_data false preserve_key false
完整FluentBit配置示例
[SERVICE] flush 1 log_level info [INPUT] name awsfirelens tag applogs # 清理ANSI颜色码 [FILTER] name sed match applogs regex \[(\d+)m(.*)\[0m replacement $2 # 解析日志级别和时间戳 [FILTER] name parser match applogs parser keyvalue_parser reserve_data false preserve_key true # 解析键值对字段 [FILTER] name parser match applogs parser keyvalue_fields key_name fields reserve_data false preserve_key false [OUTPUT] name nrlogs match applogs license_key <license-key> base_uri <host> [PARSER] name keyvalue_parser format regex regex ^\[(?<log_level>[^\]]+)\] (?<timestamp>[^,]+),\s*(?<fields>.*)$ time_key timestamp time_format %Y-%m-%dT%H:%M:%S.%L [PARSER] name keyvalue_fields format key_value delimiter , kv_delimiter : trim_key " \t" trim_value " \t"
验证效果
配置完成后,推送到New Relic的日志会自动拆分为log_level、timestamp、isRequestSuccess、responseCode等独立字段,你可以直接在New Relic查询中使用这些字段进行筛选、聚合分析,比如:
SELECT * FROM Log WHERE responseCode = '503' AND region = 'QA'
内容的提问来源于stack exchange,提问作者Madhukara Hiriadka
相关产品推荐
相关产品推荐

