首页 文章

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

提问于
浏览
1

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

1 回答

  • 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_transformerenable_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>
    

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

相关问题