2015-09-09 10 views
9

Entsprechend to the official Docker docs ist es möglich, die stdout und stderr Ausgabe eines Containers wie GELF messages zu erhalten, das ein Format ist, das z. Graylog/Graylog2 und logstash.Verwenden von docker-compose mit GELF-Protokolltreiber

Dies funktioniert einwandfrei, wenn ich meine Container manuell über die Befehlszeile ausführen. Zum Beispiel

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

wird eine Log-Nachricht an meine Graylog2 Server läuft auf localhost senden, die einen UDP Eingangs Hörer am Port 12201.

Jetzt konfiguriert hat, habe ich die gleichen Protokolloptionen mit docker-compose verwenden möchten die , gemäß den Dokumenten, should be possible in principle. Jedoch erwähnen die Dokumente keine Protokollformate aber json-file, syslog und none und wenn ich so etwas wie

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

in meiner docker-compose.yml Datei enthalten dann docker-compose up schlägt mit:

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) 

Für die Aufzeichnung dieser war auf docker-komponieren 1.4.0 und docker 1.8.1, bauen d12ea79.

Anscheinend sind Docker und Docker-Compose hier nicht auf der gleichen Ebene der Implementierung. Ich habe gerade festgestellt, dass dies bereits gelöst und in der Master branch auf Github enthalten ist, siehe https://github.com/docker/compose/issues/1869 und https://github.com/docker/docker-py/pull/724.

Gibt es eine Möglichkeit, Docker-Compose vom aktuellen Master-Zweig neu zu installieren oder manuell zu einer vorhandenen Installation hinzuzufügen? Ich konnte die Datei nicht finden, wohin das Festschreiben irgendwo auf meinem Wirt geht ...

+1

Dies wird in 'docker-py == 1.4.0' behoben und wird in der' docker-compose == 1.5.0' Version behoben – dnephin

+1

Ja, das habe ich auch gesehen. "Docker-compose == 1.5.0" wird jedoch am [10/13/2015] (https://github.com/docker/compose/wiki/1.5.0-Milestone-Project-Page) veröffentlicht Ich werde wahrscheinlich etwas warten müssen.Ich habe gerade versucht, den neuesten 'Master' von Github über' pip install -U https: // github.com/docker/docker-py.git' zu installieren und dann 'docker-compose --version' gibt die korrekte Ausgabe' 1.5 .0-dev'. Dennoch schlagen alle docker-compose-Befehle wie 'docker-compose-up' fehl mit' raise ValueError ("Kein JSON-Objekt konnte decodiert werden") ValueError: Kein JSON-Objekt konnte decodiert werden'. Irgendeine Idee zu diesem Thema? – Dirk

+0

Es sollte jetzt auf Master behoben werden – dnephin

Antwort

9

Das Problem wurde behoben.

ich Protokollierung nur getestet haben graylog2 mit Docker-komponieren 1.5.0rc2

Mit diesem Arbeitsbeispiel yaml versuchen:

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" 

Wenn der Behälter beginnt eine Warnung

ist

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

Aber es scheint nicht zu beeinflussen, dass Nachrichten an Graylog gesendet werden.

+0

Schön. Jetzt funktioniert es auch reibungslos wie in der Frage beschrieben. – Dirk

+1

Diese Warnung ist enthalten, da die Ausgabe, die Sie anzeigen, aus der gleichen Quelle wie 'docker logs' generiert wird, die für Protokolltreiber für die Off-Box nicht verfügbar ist. – allingeek

2

Für Docker-Compose v2 Dienste hat die Syntax leicht verändert, es ist alles unter einem neuen „logging“ Abschnitt jetzt:

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" 

Eine wichtige Anmerkung: Die Adresse für gelf-address Bedürfnisse sein, die externe Adresse der Server, da Docker diese Adresse über das Netzwerk des Hosts auflöst.