我正在使用一个 fluidd 容器,它挂载 /var/lib/docker/containers 目录并跟踪每个容器的所有日志。日志存储在 /var/lib/docker/containers/$container_id/$container_id-json.log 中。它们不包含容器名称或图像名称。我需要能够将单独字段中的容器和图像名称添加到来自日志文件的每个日志中。
容器名称和镜像名称都存储在/var/lib/docker/container/$container_id/config.v2.json中。我不知道如何从该文件中获取图像和名称并将其作为记录添加到相应的日志中。
这只是我的第一个想法,可能有更好的方法来做到这一点,请随时提供任何建议。
旁注:我故意不使用 Fluentd 作为 Docker 日志记录驱动程序,因为我们之前以类似的方式使用过 Logspout。目前的目标是以类似的方式用 fluidd 替换 logspout。如果日志记录驱动程序确实以更简单的方式提供此信息,那么我会考虑稍后切换。
我之前并没有真正使用过 Fluentd,因此对于这里稍微抽象的回答表示歉意。但是..检查 http://docs. Fluentd.org/ 我猜你可能正在使用
in_tail
作为日志? 从那里的示例来看,您似乎可能希望将文件的路径添加到输入消息中,la:
path /path/to/file
tag foo.*
显然用
foo.path.to.file
标记事件
我想你可能可以将 http://docs. Fluentd.org/articles/filter_record_transformer 与
enable_ruby
一起使用。由此看来,您可能可以处理 foo.path.to.file
标签并使用一点 ruby 来提取容器 ID,然后解析出 JSON 文件?
例如,使用以下 ruby 文件进行测试,
foo.rb
:
tag = 'foo.var.lib.docker.containers.ID.ID-json.log'
require 'json'; id = tag.split('.')[5]; puts JSON.parse(IO.read("/var/lib/docker/containers/#{id}/config.v2.json"))['image']
其中
config.v2.json
类似于:
{"image":"foo"}
会打印你
foo
Fluentd 可能已经为您包含了 json,所以也许您可以省略
require 'json';
位。然后,用流利的术语来说,也许你可以使用类似
<filter>
enable_ruby
<record>
container ${tag.split('.')[5]}
image ${id = tag.split('.')[5]; JSON.parse(IO.read("/var/lib/docker/containers/#{id}/config.v2.json"))['image']}
</record>
</filter>
您想将其进行生产化,但也许它可以工作?
谢谢@boybinall。有用。这是我的代码。
<filter raw.**>
@type record_transformer
enable_ruby
<record>
container ${id = tag.split('.')[5]; JSON.parse(IO.read("/var/lib/docker/containers/#{id}/config.v2.json"))["Name"][1..-1]}
hostname "#{Socket.gethostname}"
</record>
</filter>
在容器内的 Fluentd 中捕获 Docker 元数据并静默其自身的日志
在容器内运行时,我很难在 Fluentd 中捕获 Docker 容器元数据。许多适用于 Docker 元数据的 Fluentd 插件似乎已经过时,因此我最终手动实现了该解决方案。我的主要目标是提取元数据,最重要的是,沉默 Fluentd 自己的日志以防止噪音。
这是实现此目的的工作 Fluentd 配置片段:
<source>
@type tail
path /var/lib/docker/containers/*/*.log
pos_file /var/log/fluentd/docker.log.pos
tag docker
format none
path_key log_file_path
emit_unmatched_lines true
</source>
<filter docker>
@type record_transformer
enable_ruby
<record>
container ${JSON.parse(IO.read("/var/lib/docker/containers/#{record["log_file_path"].split("/")[-2]}/config.v2.json"))["Name"][1..-1]}
</record>
</filter>
<filter docker>
@type grep
<exclude>
key container
pattern ^fluentd$
</exclude>
</filter>
<match docker>
@type stdout
</match>