菜单
开源

Docker 驱动客户端配置

您可以使用 Grafana Cloud,避免自行安装、维护和扩展 Grafana Loki 实例。创建免费账户开始使用,其中包括对 1 万个指标、50GB 日志、50GB 追踪、500 VUh k6 测试等的永久免费访问。

每台机器上的 Docker 守护进程都有一个默认的日志驱动,每个容器都将使用默认驱动,除非另行配置。

安装

在配置插件之前,请安装或升级 Grafana Loki Docker Driver Client

更改容器的日志驱动

可以使用 `--log-driver` 标志为 `docker run` 命令配置使用 Docker 守护进程默认驱动以外的日志驱动。日志驱动支持的任何选项都可以使用 `--log-opt =` 标志进行设置。每个需要设置的选项都可以多次传递 `--log-opt`。

以下命令将在容器中启动 Grafana,并将日志发送到 Grafana Cloud,使用的批次大小为 400 条日志,如果发送失败最多重试 5 次。

bash
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`

json
{
  "debug": true,
  "log-driver": "loki"
}

日志驱动的选项也可以在 `daemon.json` 中使用 `log-opts` 进行配置

json
{
  "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`

yaml
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"

然后您可以使用以下命令部署您的技术栈

bash
docker stack deploy my_stack_name --compose-file docker-compose.yaml

或者使用 `docker-compose`

bash
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 值,另一个用于将其设置为标签

yaml
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 时,您也可以通过字符串参数传递值,如下所示

bash
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`。

yaml
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-urlLoki HTTP 推送端点。
loki-external-labelscontainer_name={{.Name}}要随日志发送的附加标签值对,用 `,` 分隔。该值会使用 Docker 标签模板格式进行展开。(例如:`container_name={{.ID}}.{{.Name}},cluster=prod`)
loki-timeout10s发送日志到 Loki 实例时使用的超时时间。有效的时间单位包括 “ns”, “us” (或 “µs”), “ms”, “s”, “m”, “h”。
loki-batch-wait1s发送日志批次(无论是否完成)之前等待的时间。有效的时间单位包括 “ns”, “us” (或 “µs”), “ms”, “s”, “m”, “h”。
loki-batch-size1048576
要发送的日志批次的最大大小。loki-min-backoff500ms
重试批次之前等待的最短时间。有效的时间单位包括 “ns”, “us” (或 “µs”), “ms”, “s”, “m”, “h”。loki-max-backoff5m
重试批次之前等待的最长时间。有效的时间单位包括 “ns”, “us” (或 “µs”), “ms”, “s”, “m”, “h”。10loki-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-nameloki-tls-cert-file*
用于验证服务器证书的名称。-1loki-tls-insecure-skip-verify
1false
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-filemax-size

故障排除

-1

日志轮转前的最大大小。一个正整数加上表示度量单位的修饰符 (k, m 或 g)。默认为 -1(无限制)。json-log 使用此设置来保持 `docker log` 命令正常工作。

max-file