菜单
文档breadcrumb arrow Grafana Lokibreadcrumb arrow 发送数据breadcrumb arrow Fluent Bitbreadcrumb arrow Fluent Bit 社区插件
开源

Fluent Bit 社区插件

警告

我们建议使用官方的 Fluent Bit Loki 插件。官方插件功能更丰富,对结构化元数据等功能的支持更好。社区插件仍然可用,但已不再积极维护。

Grafana Labs 的 Fluent Bit 社区插件 (grafana-loki) 提供了另一种将日志发送到 Loki 的方式。尽管与官方插件非常相似,但在配置选项上存在一些差异。本页提供了如何安装、配置和使用 Fluent Bit 社区插件将日志发送到 Loki 的说明。虽然该插件已不再积极维护,但此文档仍可供参考。

用法

Docker

您可以使用我们的 Docker Hub 镜像运行预装了 Loki 输出插件的 Fluent Bit 容器

bash
docker run -v /var/log:/var/log \
    -e LOG_PATH="/var/log/*.log" -e LOKI_URL="https://:3100/loki/api/v1/push" \
    grafana/fluent-bit-plugin-loki:latest

或者,另一种方法是使用 Docker Hub 镜像运行 fluent-bit 容器

Docker 容器日志

要使用 Fluent Bit 将 Docker 容器中的日志发送到 Grafana Cloud,您可以使用 Fluent Bit Docker 镜像并将其配置为直接将日志转发到 Grafana Loki。以下是为此目的设置 Fluent Bit 的分步指南。

前提条件

  • 您的机器上已安装 Docker。
  • 正在运行的 Loki OSS 实例。

配置

  1. 创建一个名为 fluent-bit.conf 的 Fluent Bit 配置文件,其内容如下,用于定义从 Docker 容器日志获取输入并设置输出以将日志发送到您的 Grafana Cloud Loki 实例

    ini
    [SERVICE]
        Flush        1
        Log_Level    info
    
    [INPUT]
        Name     tail
        Path     /var/lib/docker/containers/*/*.log
        Parser   docker
        Tag      docker.*
    
    [OUTPUT]
        Name         grafana-loki
        Match        *
        Url          https://:3100/loki/api/v1/push
        Labels       {job="fluentbit"}

Kubernetes

您可以将 Fluent Bit 作为 daemonset 运行,以收集所有 Kubernetes 工作负载日志。

为此,您可以使用 Fluent Bit Helm chart,并在以下 values.yaml 中更改 FLUENT_LOKI_URL 的值

yaml
image:
  # Here we use the Docker image which has the plugin installed
  repository: grafana/fluent-bit-plugin-loki
  tag: main-e2ed1c0

args:
  - "-e"
  - "/fluent-bit/bin/out_grafana_loki.so"
  - --workdir=/fluent-bit/etc
  - --config=/fluent-bit/etc/conf/fluent-bit.conf

env:
  # Note that for security reasons you should fetch the credentials through a Kubernetes Secret https://kubernetes.ac.cn/docs/concepts/configuration/secret/ . You may use the envFrom for this.
  - name: FLUENT_LOKI_URL
    value: https://user:pass@your-loki.endpoint/loki/api/v1/push

config:
  inputs: |
    [INPUT]
        Name tail
        Tag kube.*
        Path /var/log/containers/*.log
        # Be aware that local clusters like docker-desktop or kind use the docker log format and not the cri (https://docs.fluentbit.io/manual/installation/kubernetes#container-runtime-interface-cri-parser)
        multiline.parser docker, cri
        Mem_Buf_Limit 5MB
        Skip_Long_Lines On

  outputs: |
    [Output]
        Name grafana-loki
        Match kube.*
        Url ${FLUENT_LOKI_URL}
        Labels {job="fluent-bit"}
        LabelKeys level,app # this sets the values for actual Loki streams and the other labels are converted to structured_metadata https://grafana.org.cn/docs/loki/<LOKI_VERSION>/get-started/labels/structured-metadata/
        BatchWait 1
        BatchSize 1001024
        LineFormat json
        LogLevel info
        AutoKubernetesLabels true
bash
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
helm install fluent-bit fluent/fluent-bit -f values.yaml

默认情况下,它会收集所有容器日志并从 Kubernetes API 中提取标签(例如 container_namenamespace 等)。

如果您还想在集群内托管您的 Loki 实例,请安装官方 Loki Helm chart

AWS Elastic Container Service (ECS)

您可以在 AWS ECS 中将 fluent-bit Loki Docker 镜像用作 Firelens 日志路由器。有关更多信息,请参阅我们的 AWS 文档

本地

首先,您需要按照说明来构建插件动态库。

假设您的 $PATH 中安装了 Fluent Bit,您可以使用以下命令运行插件

bash
fluent-bit -e /path/to/built/out_grafana_loki.so -c fluent-bit.conf

您还可以调整您的 plugins.conf,从而无需更改命令行选项

conf
[PLUGINS]
    Path /path/to/built/out_grafana_loki.so

配置选项

描述默认值
UrlLoki 服务器 API 端点的 Url。https://:3100/loki/api/v1/push
TenantID默认用于将日志推送到 Loki 的租户 ID。如果省略或为空,则假定 Loki 在单租户模式下运行,并且不发送 X-Scope-OrgID 头部。""
批量等待在将日志批次发送到 Loki 之前等待的时间,无论批次是否已满。1s
批量大小发送到 Loki 的日志批次大小(单位:字节)。10 KiB (10 * 1024 字节)
超时等待 Loki 服务器响应请求的最长时间。10s
最小回退时间重试之间的初始回退时间。500ms
最大回退时间重试之间的最大回退时间。5m
最大重试次数发送批次时的最大重试次数。设置为 0 将无限重试。10
标签API 请求的标签。{job=“fluent-bit”}
日志级别插件日志记录器的日志级别。info
移除键指定要移除的键。none
自动 Kubernetes 标签如果设置为 true,它将把所有 Kubernetes 标签添加到 Loki 标签中。false
标签键用作流标签的逗号分隔键列表。所有其他键将被放入日志行中。当使用 LabelMapPath 标签映射配置时,LabelKeys 会被禁用。none
行格式将记录展平为日志行时使用的格式。有效值为 jsonkey_value。如果设置为 json,发送到 Loki 的日志行将是 fluentd 记录(不包括作为标签提取的任何键)以 json 格式转储。如果设置为 key_value,日志行将是记录中每个项连接在一起(由单个空格分隔)的格式 <key>=<value>。json
丢弃单个键如果设置为 true 并且提取 label_keys 后记录中只剩下一个键,则发送到 Loki 的日志行将仅是该记录键的值。true
标签映射路径指向一个 JSON 文件的路径,该文件定义如何转换嵌套记录。none
缓冲启用缓冲机制。false
缓冲类型指定要使用的缓冲机制(目前仅实现了 dque)。dque
Dque 目录队列日志的目录路径。/tmp/flb-storage/loki
Dque 段大小每段记录数的段大小。500
Dque 同步是否对每个队列更改执行 fsync。使用 normal 指定不执行 fsync,使用 full 指定执行 fsync。normal
Dque 名称队列名称,必须在每个输出中唯一。dque

标签

标签,例如 {container_name="nginx", cluster="us-west1"},用于查询日志。标签通常是关于生成日志流的工作负载的元数据(instancecontainer_nameregionclusterlevel)。在 Loki 中,标签被索引,因此在选择标签时应谨慎。高基数标签值会对查询性能产生严重影响。

您可以使用配置参数 LabelsRemoveKeysLabelKeysLabelMapPath 来指示输出插件如何从日志条目中提取标签或向所有日志条目添加静态标签。

自动 Kubernetes 标签

如果设置为 trueAutoKubernetesLabels 将自动把所有 Kubernetes 标签添加到 Loki 标签中,并忽略参数 LabelKeysLabelMapPath

标签映射路径

当使用 ParserFilter 插件时,Fluent Bit 可以提取数据并将其添加到当前记录/日志数据中。Loki 标签是键值对,而记录数据可以是嵌套结构。您可以传递一个 JSON 文件来定义如何从每个记录中提取标签。文件中的每个 JSON 键都将与日志记录匹配以查找标签值。配置中的值用作标签名称。

考虑以下记录

json
{
  "kubernetes": {
    "container_name": "promtail",
    "pod_name": "promtail-xxx",
    "namespace_name": "prod",
    "labels" : {
        "team": "x-men"
    }
  },
  "HOSTNAME": "docker-desktop",
  "log" : "a log line",
  "time": "20190926T152206Z"
}

以及如下所示的 LabelMap 文件

json
{
  "kubernetes": {
    "container_name": "container",
    "pod_name": "pod",
    "namespace_name": "namespace",
    "labels" : {
        "team": "team"
    }
  }
}

提取的标签将是 {team="x-men", container="promtail", pod="promtail-xxx", namespace="prod"}

如果您不希望 kubernetesHOSTNAME 字段出现在日志行中,可以使用 RemoveKeys 配置字段。例如,RemoveKeys kubernetes,HOSTNAME

缓冲

缓冲是指将记录存储在某处的能力,并且在处理和交付记录的同时,仍能继续存储更多记录。由于其设计,Loki 输出插件可能会被 Loki 客户端阻塞

  • 如果 BatchSize 超出限制,输出插件将暂停接收新记录,直到待处理批次成功发送到服务器
  • 如果 Loki 服务器不可达(重试 429、500 和连接级错误),输出插件会阻止新记录,直到 Loki 服务器再次可用,并且待处理批次成功发送到服务器,或者直到在配置的回退机制内达到最大尝试次数

某些输入插件的阻塞状态是不可接受的,因为它可能对生成日志的部分产生不良副作用。Fluent Bit 实现了一种基于并行处理的缓冲机制。因此,它无法按顺序发送日志。有两种处理乱序日志的方法

  • 将 Loki 配置为接受乱序写入

  • 将 Loki 输出插件配置为使用基于 dque 的缓冲机制,该机制与 Loki 服务器严格的时间排序兼容

    properties
    [Output]
        Name grafana-loki
        Match *
        Url https://:3100/loki/api/v1/push
        Buffer true
        DqueSegmentSize 8096
        DqueDir /tmp/flb-storage/buffer
        DqueName loki.0

配置示例

要配置 Loki 输出插件,请将此部分添加到您的 luent-bit.conf 文件中。

properties
[Output]
    Name grafana-loki
    Match *
    Url https://:3100/loki/api/v1/push
    BatchWait 1s
    BatchSize 30720
    # (30KiB)
    Labels {test="fluent-bit-go", lang="Golang"}
    RemoveKeys key1,key2
    LabelKeys key3,key4
    LineFormat key_value
properties
[Output]
    Name grafana-loki
    Match *
    Url https://:3100/loki/api/v1/push
    BatchWait 1s
    BatchSize 30720 # (30KiB)
    AutoKubernetesLabels true
    RemoveKeys key1,key2

Loki 仓库中还提供了完整的示例配置文件

运行多个插件实例

您可以在同一个 fluent-bit 进程中运行多个插件实例,例如,如果您想推送到不同的 Loki 服务器或将日志路由到不同的 Loki 租户 ID。为此,请添加额外的 [Output] 部分。