Docker 驱动客户端配置
您可以使用 Grafana Cloud,避免自行安装、维护和扩展 Grafana Loki 实例。创建免费账户开始使用,其中包括对 1 万个指标、50GB 日志、50GB 追踪、500 VUh k6 测试等的永久免费访问。
每台机器上的 Docker 守护进程都有一个默认的日志驱动,每个容器都将使用默认驱动,除非另行配置。
安装
在配置插件之前,请安装或升级 Grafana Loki Docker Driver Client
更改容器的日志驱动
可以使用 `--log-driver` 标志为 `docker run` 命令配置使用 Docker 守护进程默认驱动以外的日志驱动。日志驱动支持的任何选项都可以使用 `--log-opt
以下命令将在容器中启动 Grafana,并将日志发送到 Grafana Cloud,使用的批次大小为 400 条日志,如果发送失败最多重试 5 次。
docker run --log-driver=loki \
--log-opt loki-url="https://<user_id>:<password>@logs-us-west1.grafana.net/loki/api/v1/push" \
--log-opt loki-retries=5 \
--log-opt loki-batch-size=400 \
grafana/grafana
注意
Loki 日志驱动仍然结合使用 json-log 驱动来发送日志到 Loki,这主要有助于保持 `docker logs` 命令正常工作。您可以使用相应的日志选项 `max-size` 和 `max-file` 来调整文件大小和轮转。请注意,这些选项的默认值不是从 json-log 配置中获取的。您可以通过将日志选项 `no-file` 设置为 true 来禁用此行为。
更改默认日志驱动
如果您希望 Loki 日志驱动成为所有容器的默认驱动,请更改 Docker 的 `daemon.json` 文件(在 Linux 上位于 `/etc/docker`)并将 `log-driver` 的值设置为 `loki`
{
"debug": true,
"log-driver": "loki"
}
日志驱动的选项也可以在 `daemon.json` 中使用 `log-opts` 进行配置
{
"debug": true,
"log-driver": "loki",
"log-opts": {
"loki-url": "https://<user_id>:<password>@logs-us-west1.grafana.net/loki/api/v1/push",
"loki-batch-size": "400"
}
}
注意
daemon.json 中的 log-opt 配置选项必须作为
字符串提供。因此,布尔值和数值(例如上面示例中的 loki-batch-size 的值)必须用引号 (`"`) 括起来。
更改 `daemon.json` 后,重启 Docker 守护进程使更改生效。该主机上所有**新创建的**容器将通过该驱动发送日志到 Loki。
为 Swarm 服务或 Compose 配置日志驱动
您还可以在 compose 文件中直接为 swarm 服务配置日志驱动。这也适用于 `docker-compose`
version: "3.7"
services:
logger:
image: grafana/grafana
logging:
driver: loki
options:
loki-url: "https://<user_id>:<password>@logs-prod-us-central1.grafana.net/loki/api/v1/push"
然后您可以使用以下命令部署您的技术栈
docker stack deploy my_stack_name --compose-file docker-compose.yaml
或者使用 `docker-compose`
docker-compose -f docker-compose.yaml up
部署后,Grafana 服务将发送其日志到 Loki。
注意
每个 swarm 服务的堆栈名称和服务名称,以及每个 compose 服务的项目名称和服务名称,都会被自动发现并作为 Loki 标签发送,这样您就可以在 Grafana 中通过它们进行过滤。
标签
Loki 可以接收一组标签以及日志行。这些标签用于索引日志条目,并使用 LogQL 流选择器进行日志查询。
默认情况下,Docker 驱动将为每条日志行添加以下标签
filename
: 日志写入磁盘的位置host
: 生成日志的主机名swarm_stack
,swarm_service
: 从 Docker Swarm 部署时添加。compose_project
,compose_service
: 使用 Docker Compose 部署时添加。
可以使用 `loki-external-labels`、`loki-pipeline-stages`、`loki-pipeline-stage-file`、`labels`、`env` 和 `env-regex` 选项添加自定义标签。有关所有支持的选项,请参阅下一节。
`loki-external-labels` 的默认值为 `container_name={{.Name}}`。如果您为 `loki-external-labels` 设置了自定义值,则该值将替换默认值,这意味着您将不会有 `container_name` 标签,除非您明确添加它(例如:`loki-external-labels: "job=docker,container_name={{.Name}}"`。
流水线阶段
虽然您可以提供 `loki-pipeline-stage-file`,但将配置文件挂载到驱动根文件系统可能比较困难。这就是为什么提供了另一个选项 `loki-pipeline-stages`,它允许您以内联方式传递阶段列表。流水线阶段最后在每一行上运行。
下面的 docker-compose 示例配置了 2 个阶段,一个用于提取 level 值,另一个用于将其设置为标签
version: "3"
services:
grafana:
image: grafana/grafana
logging:
driver: loki
options:
loki-url: http://host.docker.internal:3100/loki/api/v1/push
loki-pipeline-stages: |
- regex:
expression: '(level|lvl|severity)=(?P<level>\w+)'
- labels:
level:
ports:
- "3000:3000"
注意
注意 `loki-pipeline-stages: |`,它允许您保持正确的缩进。
当使用 docker run 时,您也可以通过字符串参数传递值,如下所示
read -d '' stages << EOF
- regex:
expression: '(level|lvl|severity)=(?P<level>\\\w+)'
- labels:
level:
EOF
docker run --log-driver=loki \
--log-opt loki-url="http://host.docker.internal:3100/loki/api/v1/push" \
--log-opt loki-pipeline-stages="$stages" \
-p 3000:3000 grafana/grafana
这会更困难一些,因为您需要正确转义 bash 特殊字符。(注意 `\w+` 变为 `\\\w+`)
同时提供 `loki-pipeline-stage-file` 和 `loki-pipeline-stages` 将导致错误。
重新标记
您可以使用 Prometheus 重新标记配置来修改驱动发现的标签。配置必须作为 YAML 字符串传递,就像流水线阶段一样。
重新标记阶段每个容器只会发生一次,并在容器启动时应用于容器元数据。因此,您可以例如重命名仅在容器启动期间可用的标签,而不是日志行上可用的标签。请改用流水线阶段。
例如,下面的配置将把标签 `swarm_stack` 和 `swarm_service` 分别重命名为 `namespace` 和 `service`。
version: "3"
services:
grafana:
image: grafana/grafana
logging:
driver: loki
options:
loki-url: http://host.docker.internal:3100/loki/api/v1/push
loki-relabel-config: |
- action: labelmap
regex: swarm_stack
replacement: namespace
- action: labelmap
regex: swarm_(service)
ports:
- "3000:3000"
支持的 log-opt 选项
要指定其他日志驱动选项,可以使用 –log-opt NAME=VALUE 标志。
选项 | 是否必须? | 默认值 | 描述 |
---|---|---|---|
loki-url | 是 | Loki HTTP 推送端点。 | |
loki-external-labels | 否 | container_name={{.Name}} | 要随日志发送的附加标签值对,用 `,` 分隔。该值会使用 Docker 标签模板格式进行展开。(例如:`container_name={{.ID}}.{{.Name}},cluster=prod`) |
loki-timeout | 否 | 10s | 发送日志到 Loki 实例时使用的超时时间。有效的时间单位包括 “ns”, “us” (或 “µs”), “ms”, “s”, “m”, “h”。 |
loki-batch-wait | 否 | 1s | 发送日志批次(无论是否完成)之前等待的时间。有效的时间单位包括 “ns”, “us” (或 “µs”), “ms”, “s”, “m”, “h”。 |
loki-batch-size | 否 | 1048576 | 否 |
要发送的日志批次的最大大小。 | 否 | loki-min-backoff | 500ms |
重试批次之前等待的最短时间。有效的时间单位包括 “ns”, “us” (或 “µs”), “ms”, “s”, “m”, “h”。 | 否 | loki-max-backoff | 5m |
重试批次之前等待的最长时间。有效的时间单位包括 “ns”, “us” (或 “µs”), “ms”, “s”, “m”, “h”。 | 否 | 10 | loki-retries |
否 | 否 | 日志批次的最大重试次数。设置为 `0` 将无限期重试。 | |
loki-pipeline-stage-file | 否 | 否 | |
流水线阶段配置文件的位置(示例)。流水线阶段允许解析日志行以提取更多标签,请参阅相关文档。 | 否 | loki-pipeline-stages | |
否 | 否 | 以字符串形式提供的流水线阶段配置,请参阅流水线阶段和相关文档。 | |
loki-relabel-config | 否 | 否 | |
一个 Prometheus 重新标记配置,允许您重命名标签,请参阅重新标记。 | 否 | loki-tenant-id | |
否 | 否 | 发送日志到 Loki 时设置租户 ID(http 头`X-Scope-OrgID`)。它可以通过流水线阶段覆盖。 | |
loki-tls-ca-file | 否 | 否 | |
设置自定义证书颁发机构的路径。 | 否 | loki-tls-cert-file * | 否 |
设置客户端证书文件的路径。 | 否 | loki-tls-key-file | |
否 | 否 | loki-tls-cert-file * | 设置客户端私钥的路径。 |
loki-tls-server-name | 否 | loki-tls-cert-file * | 否 |
用于验证服务器证书的名称。 | 否 | -1 | loki-tls-insecure-skip-verify |
否 | 否 | 1 | false |
labels | 否 | 允许跳过 TLS 验证。 | |
loki-proxy-url | 否 | 否 | |
Proxy URL use to connect to Loki. | 否 | Proxy URL,用于连接到 Loki。 |
no-file
否
默认为“true”,会创建文件。设置为“False”告诉驱动不要在磁盘上创建日志文件。但这意味您将无法再在容器上使用 `docker logs` 命令。如果您不需要使用 `docker logs` 并且磁盘空间有限,请使用此设置。 | keep-file |
---|---|
否 | 默认为“true”,容器停止后文件会被移除。设置为“False”告诉驱动在容器停止后保留 JSON 日志文件。 |
loki-tls-cert-file | max-size |
故障排除
否
-1
日志轮转前的最大大小。一个正整数加上表示度量单位的修饰符 (k, m 或 g)。默认为 -1(无限制)。json-log 使用此设置来保持 `docker log` 命令正常工作。
max-file