Top 10 Docker Logging Gotchas, die jeder Docker-Benutzer kennen sollte

Einer der ersten Befehle, die Docker—Benutzer nach „docker run“ lernen, ist „docker logs“ – aber wussten Sie, dass der Befehl „docker logs“ nicht immer funktioniert? Das mag erstaunlich klingen, aber es ist wahr. Wir werden später mehr über die Gründe erfahren.

Docker hat nicht nur die Art und Weise geändert, wie Anwendungen bereitgestellt werden, sondern auch den Workflow für die Protokollverwaltung. Anstatt Protokolle in Dateien zu schreiben, schreiben Container Protokolle in die Konsole (stdout / stderr) und Docker-Protokollierungstreiber leiten Protokolle an ihr Ziel weiter. Eine Überprüfung auf Docker Github-Probleme zeigt schnell, dass Benutzer verschiedene Probleme beim Umgang mit Docker-Protokollen haben.

Übersicht der Docker-Protokollierungstreiber

Das Verwalten von Protokollen mit Docker scheint schwierig zu sein und erfordert tiefere Kenntnisse der Implementierungen und Alternativen von Docker-Protokollierungstreibern, um Probleme zu beheben, die von Personen gemeldet werden. Was sind die Top 10 Docker Logging Gotchas, die jeder Docker-Benutzer kennen sollte?

Beginnen wir mit einem Überblick über Docker-Protokollierungstreiber und Optionen zum Versenden von Protokollen an zentrale Protokollverwaltungslösungen wie Elastic Stack (ehemals ELK Stack) oder Sematext Cloud.

In den frühen Tagen von Docker waren Containerprotokolle nur über die Docker remote API verfügbar, dh über den Befehl „docker logs“ und einige erweiterte Protokollversender. Später führte Docker Protokollierungstreiber als Plugins ein, um Docker für die Integration mit verschiedenen Protokollverwaltungstools zu öffnen. Diese Protokollierungstreiber sind als binäre Plugins im Docker-Daemon implementiert. Vor kurzem wurde die Plugin-Architektur erweitert, um Logging-Plugins als externe Prozesse auszuführen, die sich als Plugins registrieren und Protokolle über Linux-FIFO-Dateien abrufen können. Derzeit sind die mit Docker-Binärdateien gelieferten Protokollierungstreiber binäre Plugins, dies könnte sich jedoch in naher Zukunft ändern.

Docker-Protokollierungstreiber empfangen Containerprotokolle und leiten sie an entfernte Ziele oder Dateien weiter. Der Standard-Protokollierungstreiber ist „json-file“. Es speichert Containerprotokolle im JSON-Format auf der lokalen Festplatte. Docker verfügt über eine Plugin-Architektur zum Protokollieren von Treibern, sodass Plugins für Open-Source-Tools und kommerzielle Tools verfügbar sind:

  • Journald – Speichern von Containerprotokollen im Systemjournal
  • Syslog–Treiber – unterstützt UDP, TCP, TLS
  • Fluentd – unterstützt TCP– oder Unix-Socket-Verbindungen zu fluentd
  • Splunk – HTTP / HTTPS-Weiterleitung an Splunk Server
  • Gelf – UDP-Protokollweiterleitung an Graylog2

Für eine vollständige Protokollverwaltungslösung müssen zusätzliche Tools einbezogen werden:

  • Log-Parser zur Strukturierung von Logs, typischerweise Teil von Log Shippers (fluentd, rsyslog, logstash, logagent, …)
  • Log-Indizierung, Visualisierung und Alarmierung:
    • Elasticsearch und Kibana (Elastic Stack, auch bekannt als ELK Stack),
    • Splunk,
    • Logentries,
    • Loggly,
    • Sumologic,
    • Graylog OSS / Enterprise
    • Sematext Cloud / Enterprise
    • und viele mehr …

Um Protokolle an eines der Backends zu senden, müssen Sie möglicherweise einen Protokollierungstreiber oder ein Protokollierungstool auswählen, das die Protokollverwaltungslösung Ihrer Wahl unterstützt. Wenn Ihr Tool eine Syslog-Eingabe benötigt, können Sie den Syslog-Treiber auswählen.

1.Der Befehl Docker logs funktioniert nur mit dem Protokollierungstreiber für JSON-Dateien

Der Standardprotokollierungstreiber „json-file“ schreibt Protokolle auf die lokale Festplatte, und der Treiber für json-Dateien ist der einzige, der parallel zum Befehl „docker logs“ funktioniert. Sobald alternative Protokollierungstreiber wie Syslog, Gelf oder Splunk verwendet werden, schlagen die API-Aufrufe von Docker logs fehl, und der Befehl „docker logs“ zeigt einen Fehler an, der die Einschränkungen meldet, anstatt die Protokolle auf der Konsole anzuzeigen. Nicht nur der Befehl docker log schlägt fehl, auch viele andere Tools, die die Docker-API für Protokolle verwenden, z. B. Docker-Benutzeroberflächen wie Portainer oder Protokollsammlungscontainer wie Logspout, können die Containerprotokolle in dieser Situation nicht anzeigen.

Siehe dieses Problem.

Der Docker Syslog-Treiber kann die Containerbereitstellung blockieren und Protokolle verlieren, wenn der Syslog-Server nicht erreichbar ist

Die Verwendung des Docker Syslog-Treibers mit TCP oder TLS ist eine zuverlässige Methode zur Bereitstellung von Protokollen. Der Syslog-Protokollierungstreiber erfordert jedoch eine hergestellte TCP-Verbindung zum Syslog-Server, wenn ein Container gestartet wird. Wenn diese Verbindung zum Zeitpunkt des Containerstarts nicht hergestellt werden kann, schlägt der Containerstart mit einer Fehlermeldung wie

fehldocker: Fehlerantwort vom Daemon: Fehler beim Initialisieren des Protokollierungstreibers: Wählen Sie tcp

Dies bedeutet, dass ein temporäres Netzwerkproblem oder eine hohe Netzwerklatenz die Bereitstellung von Containern blockieren kann. Darüber hinaus könnte ein Neustart des Syslog-Servers alle Container, die über TCP / TS protokolliert werden, auf einen zentralen Syslog-Server herunterfahren, was definitiv zu vermeiden ist.

Siehe dieses Problem.

3. Der Docker-Syslog-Treiber verliert Protokolle, wenn das Ziel nicht erreichbar ist

Ähnlich wie beim obigen Problem führt der Verlust von Protokollen dazu, dass die Docker-Protokollierungstreiber Protokolle nicht auf der Festplatte puffern können, wenn sie nicht an entfernte Ziele gesendet werden können. Hier ist ein interessantes Thema zu sehen.

4. Docker-Protokollierungstreiber unterstützen keine mehrzeiligen Protokolle wie error Stack Traces

Wenn wir über Protokolle sprechen, denken die meisten Leute an einfache einzeilige Protokolle, z. B. Nginx- oder Apache-Protokolle. Protokolle können jedoch auch mehrere Zeilen umfassen. Um Logstash-Benutzern zu helfen, haben wir gezeigt, wie Stack-Traces mit Logstash behandelt werden.

Die Dinge sind nicht besser in der Welt der Container, wo die Dinge noch komplizierter werden, weil Protokolle von allen Apps, die in Containern ausgeführt werden, an dieselbe Ausgabe ausgegeben werden – stdout . Kein Wunder, dass issue #22920 mit „Closed. Ist mir egal.“ ich habe so viele Menschen enttäuscht. Glücklicherweise gibt es Tools wie Sematext Docker Agent, die mehrzeilige Protokolle sofort analysieren und benutzerdefinierte mehrzeilige Muster anwenden können.

Der Befehl Docker Service logs hängt mit dem Nicht-JSON-Protokollierungstreiber

Während der json-files-Treiber robust erscheint, können andere Protokolltreiber leider immer noch Probleme mit dem Docker-Schwarmmodus verursachen. Siehe dieses GitHub-Problem .

Der Docker-Daemon stürzt ab, wenn der Fluentd-Daemon weg ist und der Puffer voll ist

Ein weiteres Szenario, in dem ein Protokollierungstreiber Probleme verursacht, wenn das Remote—Ziel nicht erreichbar ist – in diesem speziellen Fall lösen die Protokollierungstreiber Ausnahmen aus, die zum Absturz des Docker-Daemons führen.

Docker-Container bleibt bei Splunk-Treiberfehler im erstellten Status hängen

Wenn der Splunk-Server beim Containerstart eine 504 zurückgibt, wird der Container tatsächlich gestartet, aber Docker meldet den Container als fehlgeschlagen. In diesem Zustand wird der Container nicht mehr unter docker ps angezeigt, und der Containerprozess kann nicht mit docker kill gestoppt werden. Die einzige Möglichkeit, den Prozess zu stoppen, besteht darin, ihn manuell zu beenden.

Siehe dieses Problem.

Docker-Protokolle überspringen / fehlende Anwendungsprotokolle (Journald-Treiber)

Es stellt sich heraus, dass dieses Problem durch Journald-Ratenbeschränkungen verursacht wird, die erhöht werden müssen, da Docker Protokolle für alle ausgeführten Anwendungen erstellt und Journald aufgrund seiner Ratenbeschränkungseinstellungen möglicherweise einige Protokolle überspringt. Beachten Sie daher Ihre Journaleinstellungen, wenn Sie Docker damit verbinden.

Probleme mit dem Gelf-Treiber

Dem Gelf-Protokollierungstreiber fehlt eine TCP- oder TLS-Option und er unterstützt nur UDP. Einige Probleme berichten von einem Problem der DNS-Auflösung / Zwischenspeicherung mit GELF—Treibern, sodass Ihre Protokolle möglicherweise an „Nirvana“ gesendet werden, wenn sich die IP-Adresse Ihres Graylog-Servers ändert.

Docker unterstützt nicht mehrere Protokolltreiber

Es wäre schön, Protokolle lokal auf dem Server zu speichern und sie an Remote-Server zu senden. Derzeit unterstützt Docker nicht mehrere Protokolltreiber, sodass Benutzer gezwungen sind, einen einzelnen Protokolltreiber auszuwählen. Keine leichte Entscheidung, wenn man verschiedene in diesem Beitrag aufgeführte Probleme kennt.

Das war’s! Dies sind meine Top 10 Docker Logging Gotchas!

SIEHE AUCH: Continuous Delivery mit Jenkins & Docker-Sicherheit: Die Vor- und Nachteile und ein Statusupdate

Alternativen zu Docker-Protokolltreibern

Gibt es bei so vielen Problemen mit Docker-Protokolltreibern Alternativen? Es stellt sich heraus, dass es – Docker API-basierte Log-Shipper zur Rettung gibt!zur Rettung.

Hier sind einige gute Gründe, sich solche Alternativen anzusehen:

  1. Json-File-Treiber ist der Standard und zuverlässig, eine lokale Kopie der Protokolle ist immer verfügbar, und die ‚Docker Logs‘ UND Docker API-Aufrufe für Protokolle funktionieren einfach.
  2. Möglichkeit, Protokolle nach verschiedenen dynamischen Kriterien wie Bildnamen oder Beschriftungen zu filtern
  3. Bessere Metadaten, voller Zugriff auf die Docker-API
  4. Kein Risiko eines Absturzes des Docker-Daemons, da solche Protokollversender in einem Container mit begrenzter Ressourcennutzung und Festplattenspeicherverbrauch (z. legen Sie das Pufferverzeichnis in ein Volume und legen Sie nützliche Grenzwerte fest)

Schauen wir uns zwei empfohlene Docker-API-basierte Protokollerfassungstools an: Logspout und Sematext Docker Agent. Beide sind Open Source.

Bitte beachten Sie, dass ein drittes Tool, das mehr oder weniger in diese Kategorie passt, Elastic Filebeat ist. Filebeat sammelt Protokolldateien aus, die vom json-file Log Driver generiert werden Nur die Anreicherung für Container-Metadaten erfolgt über Docker-API-Aufrufe.

Logspout bietet mehrere Ausgaben und kann Protokolle von verschiedenen Containern an verschiedene Ziele weiterleiten, ohne die Protokollierungseinstellungen für Anwendungscontainer zu ändern. Es behandelt ANSI-Escape-Sequenzen (wie Farbcodes in Protokollen), die für die Volltextsuche in Elasticsearch problematisch sein können.

Wie Logspout ist Sematext Docker Agent (SDA) API-basiert, unterstützt Log-Routing und verarbeitet ANSI-Escape-Sequenzen für die Volltextsuche. Sematext Docker Agent ist jedoch mehr als nur ein einfacher Protokollversender.

SDA kümmert sich um viele von Docker-Benutzern aufgeworfene Probleme wie mehrzeilige Protokolle, Erkennung und Analyse von Protokollformaten, vollständige Container zur Anreicherung von Metadaten (Etiketten, Geoip, Schwarm- und Kubernetes-spezifische Metadaten), Festplattenpufferung und zuverlässiger Versand über TLS. Es ist Open Source auf Github, kann mit dem Elastic Stack oder der Sematext Cloud verwendet werden und kann nicht nur Containerprotokolle, sondern auch Containerereignisse sowie Docker-Host- und Containermetriken sammeln.

Unterschiede zwischen drei Protokollierungslösungen, die gut mit dem JSON-File-Treiber und der Docker Remote API funktionieren

Empfehlung

Die klare Empfehlung für API-basierte Logger könnte sich in Zukunft ändern, da sich die Docker-Log-Treiber im Laufe der Zeit verbessern und der neue Plugin-Mechanismus über Unix-Socket die Ausführung neuer Logging-Treiber-Implementierungen als separate Prozesse ermöglicht. Diese Funktion verbessert die Protokollierungs-Plugin-Architektur von Docker erheblich und ist ein gutes Zeichen dafür, dass Docker Protokollierungsprobleme ernst nimmt.

In der Zwischenzeit sollten Sie Docker-API-basierte Protokollsammler wie Sematext Docker Agent und Logspout in Betracht ziehen, um Probleme mit Docker-Protokollen zu vermeiden, wie die hier beschriebenen 10 Fallstricke.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.