如何从 Docker 控制流利的日志标签

bri*_*anz 3 logging fluentd docker

当前设置正在使用fluentd驱动程序运行 Docker 容器:

docker run --log-driver=fluentd my-container
Run Code Online (Sandbox Code Playgroud)

这很容易工作……将标准输出发送到主机上本地运行的 fluentd 系统。

我想tag使用一些设置在容器上的标签来控制 fluentd 。对于这个例子,假设一些标签(docker inspect片段):

"Config": {
    "Labels": {
       "com.amazonaws.ecs.container-name": "web",
       "com.amazonaws.ecs.task-definition-version": "3"
    }
}
Run Code Online (Sandbox Code Playgroud)

如何fluentd tag通过提取一个或多个 来设置Labels

此列表中的 Docker 文档列出了当前支持的标签:https : //docs.docker.com/engine/admin/logging/log_tags/

这些文档记录了ExtraAttributes……但是我可以弄清楚如何使用它来查找一个或多个标签。阅读 Docker 代码我不清楚:https : //github.com/docker/docker/blob/master/daemon/logger/context.go#L29

这与docker inspect以下内容无关:

docker inspect --format '{{index .ContainerLabels "com.amazonaws.ecs.container-name"}}'
Run Code Online (Sandbox Code Playgroud)

我想提取相同的信息并将其输入 log-opt tag=?

Mat*_*att 5

ContainerLabels图是一个在码头工人登录上下文中可用的物品fluentd驱动程序支持ParseLogTag所以你可以使用去模板格式。

在直接 docker 中,这看起来像:

docker run \
  --label alabel=1value \
  --log-driver=fluentd \
  --log-opt tag="{{ .ContainerLabels.alabel }}" \
  busybox \
  echo "$(date) test log"
Run Code Online (Sandbox Code Playgroud)

因此,如果您可以将 a 注入--log-opt到您的 ECS 启动中,如下所示:

--log-opt tag='{{ index .ContainerLabels "com.amazonaws.ecs.container-name" }}' 
Run Code Online (Sandbox Code Playgroud)

你应该得到你的标签。

index此处需要使用非字母数字字符访问地图键