Wir beschäftigen uns bei Netways viel mit den Themen Logging, Log Management und der Visualisierung eben dieser. Kein Wunder, gehört Logging doch mit zu den essenziellen Teilen eines jeden guten Monitorings. Logs sind seit jeher sowohl für Entwickler auch als auf Adminitratoren wichtig, also quasi total devops. So zieht sich dieses Thema mit der Zeit durch alle Techniken während immer weiter neue Lösungen entwickelt und alte verbessert werden. Es ist also keine Überraschung das es auch in Bezug auf Docker, dem größten Hype überhaupt in letzter Zeit, nicht zu vernachlässigen ist. Wir werden oft gefragt, was denn jetzt nun die richtige Lösung ist  um an die Logs der geliebten Docker Container zu kommen. Nun, eine pauschalte Antwort darauf gibt es wohl nicht, ich kann aber einen Überblick geben.
Wenn wir über Docker und Logs reden ist es wichtig zu wissen, das es dabei (meist) ausschließlich um den Standard-Output des jeweiligen Containers geht. In der Regel besteht ein Container aus einem einzigen Prozess der die gewünschte Applikation startet und nichts weiter. Ein Syslog Daemon ist also nicht vorhanden und somit gibt es innerhalb des Containers auch kein richtiges Logging. Man könnte jeden Container aufblähen und ihm ordentliches Logging verpassen mit einem ordentlichen Syslog Daemon, der kategorisieren und an weitere Syslogs Server schicken kann. Die bevorzugte Variante ist jedoch alles nach stdout und sdterr zu schicken, da man darauf auch von außerhalb des Containers zugreifen kann.
Überblick
Docker unterstützt verschiedene Driver für das Logging. Anhand eines gewählten Drivers beim Start des Cointainers lässt sich steuern wohin Logs weitergeleitet werden. Zu jedem Driver gibt es Optionen die mitgegeben werden können.

   docker run --log-driver=... --log-opt ...

Immer wieder kommen mit neuen Docker Versionen neue Features oder gar neue Driver hinzu. Neben den verschiedenen Log Drivern lässt sich auch none einstellen, um das Logging komplett zu deaktivieren.
Der Standard
Zugegeben, Logging war zu Beginn nicht gerade ein priorisiertes Thema im Docker Projekt. Dennoch gibt es schon lange eine rudimentäre Stütze zum auslesen von Logs. Standardmäßig wird alles in json-Dateien geschrieben. Auslesen kann man diese dann am einfachsten mit dem docker logs Kommando.

   docker run -d ubuntu bash -c "while true; do echo `uptime`; sleep 10; done"
   docker logs 1a2e14a58c75
     10:53:34 up 4 days, 13:29, 4 users, load average: 0.38, 0.33, 0.35
     10:53:34 up 4 days, 13:29, 4 users, load average: 0.38, 0.33, 0.35

Der Alleskönner
Syslog ist der Alleskönner unter den Docker Logging Drivers. Unter Verwendung des Syslog Standards werden Logs an entfernte Daemons weitergeleitet. Das macht es lohnenswert diese für die weitere Verarbeitung und Analyse an Logstash zu schicken.

   docker run -i -t --log-driver=syslog --log-opt syslog-address=udp://logstash.netways.de:514 ubuntu bash -c "while true; do echo `uptime`; sleep 10; done"

Zusätzlich zum Syslog Server lassen sich auch ein paar weitere Optionen setzen:

   --log-opt syslog-facility=daemon
   --log-opt syslog-tag="myContainer"

Der Neue
Mit der Docker Version 1.8 verzeichnete das Projekt Graylog einen Erfolg in der Zusammenarbeit mit Docker. Ihr bekanntes Format GELF (Graylog Extended Log Format) wurde mit aufgenommen und ist seitdem als eigener Log Driver verfügbar. Da sich das Format nicht nur mit dem dazugehörigen Prodokut Graylog benutzen lässt, sondern auch von Logstash unterstützt wird, ist es eine echte alternative zum klassischen Syslog.

   docker run -i -t --log-driver=gelf --log-opt gelf-address=udp://logstash.netways.de --log-opt gelf-tag="myContainer" ubuntu bash -c "while true; do echo `uptime`; sleep 10; done"

Die Anderen
Die genannten Möglichkeiten sind nicht alle, es gibt auch Log Driver für FluentD und journald, dazu aber ein anderes Mal mehr.

Blerim Sheqa
Blerim Sheqa
Product Manager

Blerim ist seit 2013 bei NETWAYS und seitdem schon viel in der Firma rum gekommen. Neben dem Support und diversen internen Projekten hat er auch im Team Infrastruktur tatkräftig mitgewirkt. Hin und wieder lässt er sich auch den ein oder anderen Consulting Termin nicht entgehen. Inzwischen ist Blerim als Product Manager für Icinga tätig und kümmert sich dort auch um die Partner.