AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1157838
Accepted
Kate
Kate
Asked: 2024-04-13 04:55:35 +0800 CST2024-04-13 04:55:35 +0800 CST 2024-04-13 04:55:35 +0800 CST

在 Grafana Loki 中解析嵌套的 JSON 日志(通过 Fluentd 转发)

  • 772

我的实验室有一些 Docker 容器,如下所示:

姓名 Docker镜像
流利的 流利/流利d:v1.16-1
流利位 cr. Fluentbit.io/ Fluent/Fluent-bit
洛基 格拉法纳/洛基
格拉法纳 grafana/grafana-企业
球童 球童:建造者

我的目标是收集 Caddy 日志并在 Grafana 中将它们可视化。

场景:Fluent-bit 跟踪日志并将其发送到 Fluentd。然后 Fluentd 将日志推送给 Loki。我的目标是使用 Fluentd 作为中央日志收集器。

问题在于 Grafana 端对这些日志的解析。

Caddy 日志采用(嵌套)JSON 格式。样本:

{“level”:“info”,“ts”:1712949034.535184,“logger”:“http.log.access.log1”,“msg”:“已处理的请求”,“request”:{“remote_ip”:“172.18. 0.1","re​​mote_port":"39664","client_ip":"172.18.0.1","proto":"HTTP/1.1","method":"POST","host":"grafana.darknet.com" ,"uri":"/api/short-urls","headers":{"Content-Length":["580"],"Origin":["http://grafana.darknet.com"]," Content-Type":["application/json"],"User-Agent":["Mozilla/5.0 (X11; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0"],"Accept":["application /json,文本/纯文本,*/*"],"X-Grafana-Org-Id":["1"],"连接":["keep-alive"],"接受语言":["en-US,en;q=0.5"],"接受-编码":["gzip, deflate"],"Referer":["http://grafana.darknet.com/explore?schemaVersion=1&panes=%7B%22Efb%22:%7B%22datasource%22:%22f779c221 -7bd2-468d-9f9c-96e069b869f8%22,%22queries%22:%5B%7B%22refId%22:%22A%22,%22expr%22:%22%7Bjob%3D%5C%22caddy.log.loki% 5C%22%7D%20%7C%20json%22,%22queryType%22:%22range%22,%22datasource%22:%7B%22type%22:%22loki%22,%22uid%22:%22f779c221-7bd2 -468d-9f9c-96e069b869f8%22%7D,%22editorMode%22:%22code%22%7D%5D,%22range%22:%7B%22from%22:%22now-1m%22,%22to%22:% 22now%22%7D%7D%7D&orgId=1"],"X-Grafana-Device-Id":["f343e938e74b3a57997faff69d24de8a"],"Cookie":[]}},"bytes_read":580,“user_id”:“”,“持续时间”:0.011267887,“大小”:72,“状态”:200,“resp_headers”:{“X-Xss-Protection”:[“1;模式=块”],“日期":["2024 年 4 月 12 日星期五 19:10:34 GMT"],"内容长度":["72"],"服务器":["球童"],"缓存控制":["无- store"],"Content-Type":["application/json"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["deny"]}}[“Caddy”],“Cache-Control”:[“no-store”],“Content-Type”:[“application/json”],“X-Content-Type-Options”:[“nosniff”], "X-Frame-Options":["拒绝"]}}[“Caddy”],“Cache-Control”:[“no-store”],“Content-Type”:[“application/json”],“X-Content-Type-Options”:[“nosniff”], "X-Frame-Options":["拒绝"]}}

到目前为止我已经尝试了两种不同的配置:

  1. 让 Fluent-bit 将日志发送到 Fluentd,然后 Fluentd 将日志转发到 Loki(标记为caddy.log)
    架构:Cady --> Fluent-bit --> Fluentd --> Loki

  2. 让 Fluent-bit 将日志直接发送到 Loki(标记为caddy.log.loki)
    架构:Cady --> Fluent-bit --> Loki

这里我有以下 Fluent 位配置,可以使用不同的标签同时将日志发送到 Loki 和 Fluentd :

[INPUT]
    Name tail
    Path /var/log/caddy/*.log
    Parser json
    Tag caddy.log
    Path_Key log_filename

# send logs to Fluentd
[OUTPUT]
    Name forward
    Host fluentd
    Port 24224
    Match caddy.*

# send logs straight to Loki
[OUTPUT]
    name                   loki
    match                  caddy.*
    host                   loki
    port                   3100
    labels                 job=caddy.log.loki

Fluentd配置:

<source>
  @type  forward
</source>

<match caddy.*>
  @type loki
  url "http://loki:3100"
  extra_labels {"job": "caddy.log"}
  <buffer>
    flush_interval 5s
    flush_at_shutdown true
  </buffer>
</match>

然后在 Grafana 中,我可以浏览日志,并且“浏览”窗口中提供了两个可用标签。

如果我选择标签,caddy.log.loki日志将以纯 JSON 格式显示,如下所示。通过这个表达式我可以解析它们:{job="caddy.log.loki"} | json。一些嵌套的 JSON 被提取,例如:request_client_ip 但不是全部,例如request.headers丢失了,但我可以忍受。

日志被视为 JSON

如果我选择标签,caddy.log那么日志将以“混合”格式显示:

混合格式的日志

似乎发生了一些转变,但我不确定在哪里。我可以用来logfmt解析这些行。但我仍然留下一些未解析的字段(request,resp_headers),如下所示:

使用 logfmt 后

问题:

  • 如果我添加 Fluentd 步骤,为什么日志不再以纯 JSON 格式呈现?
  • 使用 Fluentd 在 Loki/Grafana 中传送和解析嵌套 JSON 日志的最佳方式是什么?
grafana
  • 1 1 个回答
  • 37 Views

1 个回答

  • Voted
  1. Best Answer
    Thai Nguyen
    2024-04-13T13:15:21+08:002024-04-13T13:15:21+08:00

    如果我添加 Fluentd 步骤,为什么日志不再以纯 JSON 格式呈现?

    根据fluidd loki 输出插件文档,默认line_format值为key_value. 您没有在配置中指定格式fluentd,因此日志不是 JSON 格式,而是<key>=<value>format 格式。

    使用 Fluentd 在 Loki/Grafana 中传送和解析嵌套 JSON 日志的最佳方式是什么?

    您可以尝试将Nest过滤器添加到您的fluentbit配置中:

    [SERVICE]
        parsers_file    parsers.conf
    
    [INPUT]
        Name        tail
        Path        /var/log/caddy/*.log
        Parser      json
        Tag         caddy.log
        Path_Key    log_filename
    
    [FILTER]
        Name            nest
        Match           caddy.*
        Operation       lift
        Nested_under    request
    
    # Nest filter can be chained
    [FILTER]
        Name            nest
        Match           caddy.*
        Operation       lift
        Nested_under    headers
        Add_prefix      req_
    
    [FILTER]
        Name            nest
        Match           caddy.*
        Operation       lift
        Nested_under    resp_headers
        Add_prefix      resp_
    
    # send logs to Fluentd
    [OUTPUT]
        Name        forward
        Host        fluentd
        Port        24224
        Match       caddy.*
    
    # send logs straight to Loki
    [OUTPUT]
        name                   loki
        match                  caddy.*
        host                   loki
        port                   3100
        labels                 job=caddy.log.loki
    

    结果:

    Grafana 探索输出

    请注意,不带参数的 LogQL json 解析器将跳过数组(https://grafana.com/docs/loki/latest/query/log_queries/#json),因此如果您想要带有数组的字段,则必须在参数中指定它,例如例子:

    {job="caddy.log.loki"} |= `` | json request_user_agent=`["req_User-Agent"]`
    

    带参数的 LogQL JSON 解析器

    • 1

相关问题

  • 为什么此仪表板的创建者将字节乘以 8 以获得位?不是反过来吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve