Zentralisiertes Logging für Docker Applikationen mit dem Elastic Stack
Hinweis: Dieser Artikel erschien erstmalig 2019. Er hat aber weiterhin Gültigkeit.
In verteilten Applikationen besteht oft das Problem, dass Log-Daten über mehrere Server verteilt gespeichert sind.
Man kann ein Docker-Setup auch als verteilte Applikation betrachten. Die einzelnen Docker Container bilden dabei die verteilten Server. Die Container erzeugen unter Umständen lokale Log-Dateien, die nur innerhalb der Container verfügbar sind.
Die Analyse der Daten ist dadurch schwierig und zeitintensiv.
Magento 2 und Typo3 – Docker in Production
Viele Entwickler setzen Docker gerne zur Entwicklung ein. In den meisten Fällen gibt es zwei gute Gründe:
- Eine saubere und kontrollierte Umgebung ohne Betriebssystem-Einflüsse
- Nähe der Umgebung zum Produktiv-Server
Betreibt man Docker in einer Produktiv-Umgebung, dann kommen andere Schwerpunkte zum Tragen, nämlich:
- Sicherheitsrelevante Isolierung der Services untereinander
- Einfache Transportierbarkeit der Anwendung von der lokalen Umgebung auf den Produktiv-Server
- Leichtgewichtiger als virtuelle Maschinen
- Teilweise höhere Performance als virtuelle Maschinen
Wir betreiben bei einem unserer Kunden TYPO3 und Magento 2 in einem Docker-Setup im Produktiv-Betrieb.
Die folgende Liste zeigt die wesentlichen, Services die dort laufen:
- NGINX Reverse-Proxy
- 2-mal Varnish Caching Server für TYPO3 bzw. Magento
- 2-mal NGINX Webserver für TYPO3 bzw. Magento
- Diverse Redis-Container für Caching und Sessions
- RabbitMQ zur asynchronen Abarbeitung von Magento Aufgaben
- 2-mal PHP-FPM für TYPO3 bzw. Magento
- 2-mal Cron Container
- 2-mal MySQL Datenbank Container
Aufbereiten und analysieren von Logfiles mit Kibana
Die Docker-App, welche für das Aufbereiten und die Analyse der Logfiles zuständig ist, läuft parallel zur oben aufgeführten Docker-App, und besteht aus folgenden Services:
- Filebeat
- Logstash
- Elasticsearch
- Kibana
4 Services nur für Logfile Analyse? Hört sich komplex an … ist es auch.
Um zu verstehen, warum wir das alles benötigen, müssen wir uns die einzelnen Services kurz ansehen.
Filebeat
Filebeat überwacht Log-Dateien, die auf der Festplatte liegen, und schickt die Daten an Logstash. In unserem konkreten Fall kommen die Log-Dateien vom Docker Daemon.
Logstash
Über Filter-Pipelines kann Logstash einen Eingabe-Datenstrom einlesen, verarbeiten und in strukturierter Form an Elasticsearch ausgeben. Den Eingabe-Datenstrom erhält Logstash von Filebeat.
Elasticsearch
Im Elasticsearch Index sind unsere Log-Daten in strukturierter Form gespeichert und aufbereitet.
Kibana
Wir nutzen Kibana zur Analyse unserer Logfiles. Wir erhalten mit diesem Werkzeug ein optisch ansprechendes User Interface, das mit div. Filtern und Dashboards eine rasche Analyse der Daten ermöglicht. Kibana bezieht seine Daten aus Elasticsearch.
Docker Logfiles
Docker Images schreiben als Best-Practice alle Logging-Daten auf die Devices /dev/stdout und /dev/stderr. Allgemeines Logging auf stdout, Fehler auf stderr.
Alles, was auf diesen zwei Devices landet, schreibt der Docker Daemon als JSON-Daten auf die Festplatte des Docker Hosts (vorausgesetzt, man hat das nicht anders konfiguriert). Pro Container wird ein Logfile erzeugt.
Wenn wir nun Filebeat schlau konfigurieren, sodass es die JSON-Daten an Logstash übergibt, haben wir gewonnen.
Absolut hilfreich sind diese beiden GitHub Projekt
Kombiniert man beide Projekte in eine docker-compose Datei, lässt sich die Logging Applikation hochfahren und man kann sofort experimentieren.