如何在使用fluentd进行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中。 我不知道如何从该文件中获取图像和名称,并将其作为logging添加到相应的日志中。

这只是我的第一个想法,可能有更好的方法来做到这一点,随时提供任何意见。

旁注:我故意不使用fluentd作为docker日志logging驱动程序,因为我们以前以类似的方式使用了logspout。 目前的目标是用类似的方式用fluentdreplacelogspout。 如果日志logging驱动程序确实以更简单的方式提供了这些信息,那么稍后我会考虑切换。

我以前没有真正使用过fluentd,所以对于这里稍微抽象的回应,我表示歉意。 但是..检查http://docs.fluentd.org/我想你可能使用in_tail日志? 从这里的例子看来,你可能想要把文件的path导入到input消息中,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,然后parsing出JSON文件?

例如,使用下面的ruby文件testingfoo.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 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> 

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