如何在使用流利的docker日志记录时获取容器和图像名称?

时间:2016-05-10 16:15:17

标签: json logging docker fluentd

我正在使用一个流畅的容器来安装/ 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。目前的目标是以类似的方式用流利的方式替换logspout。如果日志记录驱动程序确实以更容易的方式提供此信息,那么我会考虑稍后切换。

2 个答案:

答案 0 :(得分:0)

我之前并没有真正使用过流利语,所以在这里为一个略微抽象的回应道歉。但是..检查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>

你想要生产这一点,但也许它可以工作?

答案 1 :(得分:0)

感谢@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>