You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:35:30