2016-05-10 5 views
1

Я использую контейнер fluentd, который монтирует каталог/var/lib/docker/container и обрабатывает все журналы для каждого контейнера. Журналы хранятся в файле /var/lib/docker/containers/$container_id/$container_id-json.log. Они не содержат имя контейнера или имя изображения. Мне нужно добавить контейнер и имя изображения в отдельные поля в каждый журнал, поступающий из файла журнала.Как получить имя контейнера и изображения при использовании fluentd для регистрации докеров?

Название контейнера и имя изображения хранятся в файле /var/lib/docker/container/$container_id/config.v2.json. Я не могу понять, как получить изображение и имя из этого файла и добавить его в качестве записи в соответствующие журналы.

Это была только моя первая мысль, и может быть лучший способ сделать это, не стесняйтесь предлагать какие-либо советы.

Sidenote: Я намеренно не использовал fluentd в качестве драйвера регистрации докеров, потому что мы ранее использовали logspout аналогичным образом. Текущая цель - заменить logspout на fluentd аналогичным образом. Если драйвер ведения журнала предоставляет эту информацию намного проще, я бы подумал о переходе позже.

ответ

0

Я раньше не использовал fluentd, поэтому извиняюсь за слегка абстрактный ответ здесь. Но .. проверка на http://docs.fluentd.org/ Я думаю, вы, вероятно, используете in_tail для журналов? Из примера там, это выглядит, как вы, вероятно, хотите, чтобы получить путь к файлу в входного сообщения, а-ля:

path /path/to/file 
tag foo.* 

, по-видимому теги События с foo.path.to.file

Я думаю, вам возможно, затем можно использовать http://docs.fluentd.org/articles/filter_record_transformer с enable_ruby. Из этого, похоже, вы, вероятно, можете обработать тег foo.path.to.file и использовать небольшой рубин для извлечения идентификатора контейнера, а затем проанализировать файл JSON?

Например, тестирование с помощью следующего рубинового файла, скажем, 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 для вас, так что, может быть, вы можете отказаться от t он require 'json'; бит. Затем, поставив это в fluentd условиях, возможно, вы могли бы использовать что-то вроде

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

Вы хотели бы производственно- ISE это немного, но, возможно, она могла бы работать?