Grafana Loki Docker 日志驱动配置详解
概述
Grafana Loki 是一个高效的日志聚合系统,而 Docker 日志驱动则是将容器日志直接发送到 Loki 的便捷方式。本文将深入讲解如何配置 Docker 日志驱动,实现容器日志的高效收集与管理。
Docker 日志驱动基础
Docker 引擎默认使用 json-file 日志驱动,但我们可以通过配置让容器使用 Loki 日志驱动。这种集成方式有以下优势:
- 实时日志收集:容器日志直接发送到 Loki,无需额外代理
- 资源占用低:相比传统日志收集方案更加轻量
- 原生集成:直接利用 Docker 的日志驱动机制
安装准备
在开始配置前,请确保已在 Docker 主机上安装 Loki 日志驱动插件。安装过程简单,只需执行相应命令即可完成。
单容器配置
对于单个容器,可以在 docker run
命令中直接指定日志驱动:
docker run --log-driver=loki \
--log-opt loki-url="http://loki:3100/loki/api/v1/push" \
--log-opt loki-retries=5 \
--log-opt loki-batch-size=400 \
nginx:latest
关键参数说明:
loki-url
: Loki 服务端点loki-retries
: 发送失败时的重试次数loki-batch-size
: 日志批次大小
全局默认配置
如需让所有新容器默认使用 Loki 日志驱动,可修改 Docker 的 daemon.json
配置文件:
{
"log-driver": "loki",
"log-opts": {
"loki-url": "http://loki:3100/loki/api/v1/push",
"loki-batch-size": "400",
"loki-external-labels": "cluster=prod,zone=us-east"
}
}
修改后需重启 Docker 服务使配置生效。
重要提示:在 daemon.json
中,所有选项值必须为字符串格式,即使是数字或布尔值也需要用引号包裹。
Swarm 和 Compose 配置
在 Docker Swarm 或 Compose 环境中,可以直接在 YAML 文件中配置日志驱动:
version: "3.7"
services:
web:
image: nginx:latest
logging:
driver: loki
options:
loki-url: "http://loki:3100/loki/api/v1/push"
loki-external-labels: "service=nginx"
部署后,服务日志将自动发送到 Loki。
标签系统详解
Loki 使用标签对日志进行索引和查询。Docker 驱动默认添加以下标签:
filename
: 日志在磁盘上的存储路径host
: 生成日志的主机名- 对于 Swarm 服务:
swarm_stack
,swarm_service
- 对于 Compose 服务:
compose_project
,compose_service
自定义标签可通过多种方式添加:
loki-external-labels
: 静态标签labels
: 容器标签env
: 环境变量- 日志处理管道
日志处理管道
Loki 提供了强大的日志处理管道功能,可以在日志发送前进行处理:
logging:
driver: loki
options:
loki-url: "http://loki:3100/loki/api/v1/push"
loki-pipeline-stages: |
- regex:
expression: '(level|lvl|severity)=(?P<level>\w+)'
- labels:
level:
这个例子配置了两个处理阶段:
- 使用正则表达式提取日志级别
- 将提取的级别作为标签
标签重命名
使用 Prometheus 风格的 relabel 配置可以重命名标签:
loki-relabel-config: |
- action: labelmap
regex: swarm_stack
replacement: namespace
- action: labelmap
regex: swarm_(service)
这会将 swarm_stack
重命名为 namespace
,swarm_service
重命名为 service
。
完整配置选项参考
| 选项 | 必填 | 默认值 | 说明 | |------|------|--------|------| | loki-url | 是 | 无 | Loki 服务端点 | | loki-external-labels | 否 | container_name={{.Name}} | 额外标签 | | loki-timeout | 否 | 10s | 发送超时时间 | | loki-batch-wait | 否 | 1s | 批次等待时间 | | loki-batch-size | 否 | 1048576 | 批次大小限制 | | loki-retries | 否 | 10 | 最大重试次数 | | loki-pipeline-stages | 否 | 无 | 日志处理管道 | | loki-relabel-config | 否 | 无 | 标签重命名配置 | | no-file | 否 | false | 禁用本地日志文件 | | max-size | 否 | -1 | 日志文件大小限制 | | max-file | 否 | 1 | 保留日志文件数量 |
最佳实践建议
- 批量大小调优:根据日志量调整
loki-batch-size
和loki-batch-wait
参数 - 标签设计:合理设计标签系统,避免标签基数过高
- 本地日志:生产环境建议保留本地日志(
no-file=false
),便于故障排查 - TLS 配置:生产环境务必配置 TLS 相关参数确保通信安全
- 资源限制:合理设置
max-size
和max-file
防止磁盘空间耗尽
通过合理配置 Docker 日志驱动,您可以轻松实现容器日志的集中管理和高效查询,充分发挥 Grafana Loki 的强大功能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考