2015-09-09 1 views
9

Согласно to the official Docker docs, можно получить выходные данные stdout и stderr контейнера как GELF messages, который является форматом, который понимается, например. Graylog/Graylog2 и logstash.Использование docker-compose с драйвером журнала GELF

Это прекрасно работает, когда я запускаю свои контейнеры вручную из командной строки. Например,

docker run --log-driver=gelf --log-opt gelf-address=udp://localhost:12201 busybox echo This is my message. 

отправит сообщение журнала на мой Graylog2 сервер работает на локальном хосте, который имеет UDP входной приемник, выполненный в порту 12201.

Теперь я хочу использовать те же параметры журнала с docker-compose который , согласно документам, should be possible in principle. Тем не менее, документы не упоминают любые форматы журнала, но json-file, syslog и none и когда я включаю что-то вроде

my-container: 
    container_name: ... 
    build: ... 
    ports: ... 
    log_driver: "gelf" 
    log_opt: 
    gelf-address: "udp://localhost:12201" 

в моем docker-compose.yml файл, то docker-compose up терпит неудачу с:

Traceback (most recent call last): 
    File "<string>", line 3, in <module> 
    File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.main", line 39, in main 
    File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.docopt_command", line 21, in sys_dispatch 
    File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.command", line 27, in dispatch 
    File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.docopt_command", line 24, in dispatch 
    File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.command", line 59, in perform_command 
    File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.main", line 495, in up 
    File "/code/build/docker-compose/out00-PYZ.pyz/compose.project", line 265, in up 
    File "/code/build/docker-compose/out00-PYZ.pyz/compose.service", line 369, in execute_convergence_plan 
    File "/code/build/docker-compose/out00-PYZ.pyz/compose.service", line 270, in create_container 
    File "/code/build/docker-compose/out00-PYZ.pyz/compose.service", line 643, in _get_container_create_options 
    File "/code/build/docker-compose/out00-PYZ.pyz/compose.service", line 656, in _get_container_host_config 
    File "/code/build/docker-compose/out00-PYZ.pyz/docker.utils.types", line 27, in __init__ 
ValueError: LogConfig.type must be one of (json-file, syslog, none) 

Для записи, это был на docker-compose 1.4.0 и докер 1.8.1, построить d12ea79.

По-видимому, Docker и docker-compose не находятся на одном уровне реализации здесь. Я только что нашел, что это уже было решено и включено в Master branch на Github, см. https://github.com/docker/compose/issues/1869 и https://github.com/docker/docker-py/pull/724.

Есть ли способ переустановить сборку докеров из текущей ведущей ветви или добавить ее в существующую установку вручную? Я не смог найти файл, где фиксация отправляется в любом месте моего хоста ...

+1

Это исправлено в 'docker-py == 1.4.0' и будет исправлено в выпуске' docker-compose == 1.5.0' – dnephin

+1

Да, я тоже это увидел. Однако 'docker-compose == 1.5.0' будет выпущен [10/13/2015] (https://github.com/docker/compose/wiki/1.5.0-Milestone-Project-Page), поэтому Мне, вероятно, придется немного подождать.Я просто попытался установить последний 'master' из Github через' pip install -U https: // github.com/docker/docker-py.git', а затем 'docker-compose -version' дает правильный вывод' 1.5 0,0-dev'. Тем не менее, все команды docker-compose, такие как 'docker-compose up', терпят неудачу с' raise ValueError («Нет объекта JSON можно декодировать») ValueError: объект JSON не может быть декодирован'. Любая идея по этому поводу? – Dirk

+0

Теперь он должен быть исправлен на хозяине – dnephin

ответ

9

Проблема исправлена.

Я просто проверял регистрацию в graylog2 с помощью докер-компоновать 1.5.0rc2

Вы можете попробовать с этим рабочий пример YAML:

example: 
container_name: example 
image: debian:wheezy 
    command: /bin/sh -c "while true; do date && echo "hello"; sleep 1; done" 
ports: 
    - "1234:1234" 
log_driver: "gelf" 
log_opt: 
    gelf-address: "udp://graylog.example.com:12201" 
    gelf-tag: "first-logs" 

Когда контейнер начинает есть предупреждение

example | WARNING: no logs are available with the 'gelf' log driver

Но это не влияет на то, что сообщения отправляются в graylog.

+0

Nice. Теперь также работает гладко, как описано в вопросе. – Dirk

+1

Это предупреждение включено, потому что вывод, который вы просматриваете, генерируется из того же источника, что и 'docker logs', который недоступен для внедорожных драйверов ведения журнала. – allingeek

2

Для Докер-Compose v2 услуг, синтаксис немного изменился, все это под новый раздел «лесозаготовительной» Сейчас:

version: "2" 

services: 
    example: 
    container_name: example 
    image: debian:wheezy 
    command: /bin/sh -c "while true; do date && echo "hello"; sleep 1; done" 
    ports: 
     - "1234:1234" 
    logging: 
     driver: "gelf" 
     options: 
     gelf-address: "udp://graylog.example.com:12201" 
     tag: "first-logs" 

Одно важное замечание: Адрес для gelf-address потребности быть внешний адрес сервер, так как Docker разрешает этот адрес через сеть хоста.