Fluentd 客户端
适用于 Grafana Loki 的 Fluentd 输出插件 称为 fluent-plugin-grafana-loki
,它允许将日志发送到私有 Loki 实例或 Grafana Cloud。
该插件的源代码位于仓库的 fluentd 目录中。
安装
本地
要安装该插件,请使用 fluent-gem
fluent-gem install fluent-plugin-grafana-loki
Docker 镜像
Docker 镜像 grafana/fluent-plugin-loki:main
包含默认配置文件。默认情况下,fluentd 容器使用该默认配置。您可以改用 FLUENTD_CONF
环境变量指定您的 fluentd.conf
配置文件。
此镜像还使用 LOKI_URL
、LOKI_USERNAME
和 LOKI_PASSWORD
环境变量来指定 Loki 端点、用户和密码(如果不使用用户名和密码,可以留空)。
此镜像启动一个 Fluentd 实例,将接收到的日志转发到指定的 Loki URL。另外,容器化应用也可以使用docker driver 插件来发送日志,而无需 Fluentd。
示例
一个可用的 Docker Compose 配置如下所示
services:
fluentd:
image: grafana/fluent-plugin-loki:main
command:
- "fluentd"
- "-v"
- "-p"
- "/fluentd/plugins"
environment:
LOKI_URL: http://loki:3100
LOKI_USERNAME:
LOKI_PASSWORD:
deploy:
mode: global
configs:
- source: loki_config
target: /fluentd/etc/loki/loki.conf
networks:
- loki
volumes:
- host_logs:/var/log
# Needed for journald log ingestion:
- /etc/machine-id:/etc/machine-id
- /dev/log:/dev/log
- /var/run/systemd/journal/:/var/run/systemd/journal/
logging:
options:
tag: infra.monitoring
用法
注意
使用
<label>...</label>
或extra_labels
来设置至少一个标签。
在您的 Fluentd 配置中,添加 @type loki
。附加配置是可选的。默认值如下所示
<match **>
@type loki
url "https://logs-prod-us-central1.grafana.net"
username "#{ENV['LOKI_USERNAME']}"
password "#{ENV['LOKI_PASSWORD']}"
extra_labels {"env":"dev"}
<buffer>
flush_interval 10s
flush_at_shutdown true
</buffer>
buffer_chunk_limit 1m
</match>
添加标签
来自顶级属性的简单标签
<match mytag>
@type loki
# ...
<label>
fluentd_worker
</label>
# ...
</match>
您可以重写标签键以及以下内容
<match mytag>
@type loki
# ...
<label>
worker fluentd_worker
</label>
# ...
</match>
您可以使用记录访问器语法处理嵌套字段。
<match mytag>
@type loki
# ...
<label>
container $.kubernetes.container
</label>
# ...
</match>
提取 Kubernetes 标签
由于 Kubernetes 标签是嵌套键值对的列表,因此提供了一个单独的选项来提取它们。请注意,“. - /
”等特殊字符将被 _
覆盖。与 remove_keys kubernetes
选项一起使用,可以从日志中删除元数据。
<match mytag>
@type loki
# ...
extract_kubernetes_labels true
remove_keys kubernetes
<label>
container $.kubernetes.container
</label>
# ...
</match>
您还可以通过在配置中使用
extract_kubernetes_labels true
自动包含所有 Kubernetes 标签。
多 worker 使用
Loki 默认启用乱序写入;请参阅接受乱序写入。如果乱序写入被禁用,尝试在具有相同标签但时间戳更晚的日志条目之后插入具有更早时间戳的日志条目时,插入将失败,并显示 HTTP status code: 500, message: rpc error: code = Unknown desc = Entry out of order
。因此,要在多 worker Fluentd 设置中使用此插件,您需要在标签中包含 worker ID,或以其他方式确保日志流始终发送到同一个 worker。
例如,使用fluent-plugin-record-modifier
<filter mytag>
@type record_modifier
<record>
fluentd_worker "#{worker_id}"
</record>
</filter>
<match mytag>
@type loki
# ...
<label>
fluentd_worker
</label>
# ...
</match>
使用多个缓冲区刷新线程
类似地,当在 buffer
部分使用 flush_thread_count
> 1 时,必须将线程标识符添加为标签,以确保 Fluentd 并行刷新到 Loki 的日志块始终为其唯一的标签集具有递增的时间。
当 flush_thread_count
> 1 时,此插件会自动添加一个名为 fluentd_thread
的标签,其值为缓冲区刷新线程的名称。
配置
url
用于发送日志的 Loki 服务器 URL。发送数据时,发布路径(../reference/api/loki-http-api/v1/push/
)将自动附加。默认情况下,URL 设置为 https://logs-prod-us-central1.grafana.net
,这是 Grafana Labs 托管 Loki 服务的 URL。
代理支持
从 0.8.0 版本开始,此 gem 使用 excon,后者支持使用环境变量设置代理。
username
/ password
(用户名/密码)
如果 Loki 服务器需要身份验证,请指定用户名和密码。如果使用 GrafanaLab 托管的 Loki,用户名需要设置为您的 instanceId,密码应为 Grafana.com API 密钥。
tenant (租户)
发送到 Loki(一个多租户日志存储平台)的所有请求都必须包含一个租户。对于某些安装,租户将由认证代理自动设置。否则,您可以定义一个要传递的租户。租户可以是任何字符串值。
租户字段还支持占位符,使其可以根据标签和记录字段动态变化。每个占位符都必须添加为缓冲区块键。以下是根据 Kubernetes pod 标签设置租户的示例
<match **>
@type loki
url "https://logs-prod-us-central1.grafana.net"
tenant ${$.kubernetes.labels.tenant}
# ...
<buffer $.kubernetes.labels.tenant>
@type memory
flush_interval 5s
</buffer>
</match>
客户端证书验证
如果在 Loki 前配置了带有客户端证书验证的反向代理,请使用 cert
和 key
指定客户端证书和私钥对。如果服务器使用自定义证书颁发机构,也可以指定 ca_cert
。
<match **>
@type loki
url "https://loki"
cert /path/to/certificate.pem
key /path/to/key.key
ca_cert /path/to/ca.pem
...
</match>
服务器证书验证
一个禁用服务器证书验证的标志。默认情况下,insecure_tls
设置为 false。
<match **>
@type loki
url "https://loki"
insecure_tls true
...
</match>
输出格式
Loki 旨在仅使用少量标签来索引和分组日志流。它不适用于全文索引。将日志发送到 Loki 时,大部分日志消息将作为单个日志“行”发送。
有几个配置设置可用于控制输出格式。
- extra_labels: (默认: nil) 要包含在每个 Loki 流中的标签集。例如
{"env":"dev", "datacenter": "dc1"}
- remove_keys: (默认: nil) 要删除的不必要的记录键的逗号分隔列表。所有其他键将放入日志行中。您可以使用record_accessor 语法。
- line_format (默认:key_value): 将记录展平为日志行时使用的格式。有效值是“json”或“key_value”。如果设置为“json”,发送到 Loki 的日志行将是转储为 json 的 fluentd 记录(排除作为标签提取的任何键)。如果设置为“key_value”,日志行将是记录中每个项目串联在一起(由单个空格分隔),格式为
<key>=<value>
。 - drop_single_key: 如果设置为 true,并且在提取
<label></label>
块后记录只剩下 1 个键,则将日志行设置为该值并丢弃该键。 - include_thread_label (默认: true): 当使用多个线程进行刷新时,是否包含 fluentd_thread 标签。
缓冲区选项
fluentd-plugin-loki
扩展了Fluentd 的内置输出插件,并使用 compat_parameters
插件助手。它添加了以下选项
buffer_type memory
flush_interval 10s
retry_limit 17
retry_wait 1.0
num_threads 1