© MOLPIX/Shutterstock.com
Elastic Stack aus Containern betreiben

Logging leicht gemacht


Serverlogs wachsen einem schnell über den Kopf, vor allem bei im großen Maßstab ausgerollten Applikationen. Der Elastic Stack bietet ausgereifte Komponenten für das Einsammeln und zentrale Auswerten von Logmessages, in dessen Zentrum die Big-Data-Suchmaschine Elasticsearch steht. Dieser Artikel zeigt, wie Sie eine einfache Log Shipping Pipeline mit Elastic-Elementen aus Docker-Containern heraus aufsetzen.

Logmeldungen sind kostbare Datensammlungen für die Fehleranalyse, Funktions- und Zugriffskontrolle von Computersystemen. Auf einem einzelnen Linux-Server gibt es bereits eine ganze Reihe von Logerzeugern: Eine darauf betriebene Applikation gibt normalerweise laufend Statusmeldungen aus, genauso die eingesetzte Middleware sowie das Betriebssystem mit Kernel und Services. Bei einer einfachen Wordpress-Installation zum Beispiel genügen Administrationsbordmittel wie grep, cut und tail eventuell noch, um die aufkommende, nicht geringe Menge an Logdaten zu bewältigen. Bei im großen Maßstab und auf vielen Knoten ausgerollten Applikationen ist es allerdings nicht mehr möglich, sich etwa bei einem Systemausfall der Reihe nach auf einzelnen Maschinen einzuloggen und dort unter Zeitdruck mit Texttools nach relevanten Logmeldungen zu suchen. Anstatt sich Werkzeuge für das zentrale Einsammeln und Auswerten von Logs selbst zu basteln, kommen für die Logaggregation heutzutage professionelle Lösungen zum Einsatz, die auf Enterprise-Niveau arbeiten können und zu denen der Elastic Stack [1] gehört.

Elastic Stack

Der Elastic Stack (auch „ELK-Stack“) ist eine Sammlung von einzelnen Komponenten für die Logverarbeitung, in deren Mittelpunkt die hoch performante Suchmaschine Elasticsearch steht. Sie ist in Java implementiert, setzt auf der Volltextsuchebibliothek Apache Lucene [2] auf und ist für ein massives Datenaufkommen im Bereich Big Data ausgelegt. Zusammen mit der Visualisierungsplattform Kibana bildet Elasticsearch ein mächtiges Gespann für die Analyse von Daten im NoSQL- beziehungsweise JSON-Format, deren Funktionalität auch über den speziellen Anwendungszweck der zentralen Sammlung und Auswertung von Serverlogdaten hinausgeht. Um eine Log-Shipping-Pipeline aufzusetzen, also Systemmeldungen von Servern einzusammeln und in Elasticsearch hineinzubekommen, existieren im Elastic Stack weitere Komponenten.

Da gibt es zunächst einmal das mittlerweile in JRuby geschriebene Logstash [3], das zum Einsammeln von Logdaten (als „Shipper“) wie etwa auf Servern eingesetzt werden kann. Darüber hinaus lässt es sich mit seinen vielen eingebauten Filter-Plug-ins auch als zentralen Indexer betreiben, um verschiedenartig strukturierte Logmessageformate aus unterschiedlichen Quellen zu harmonisieren und in Elasticsearch einheitlich zu integrieren. Logstash ist umfangreich und kann nahezu alles auswerten, was regelmäßig Meldungen absetzt. Dazu gehören beliebige Logdateien und -ströme, Messagingsysteme, Syslog-Meldungen, Twitter, aber auch Sensor- und Signaldaten wie etwa aus Kraftfahrzeugen und von Wetterstationen.

Eine relativ neue Entwicklung im Elastic Stack sind die sogenannten Beats [4]. Dabei handelt es sich um eine Gruppe von in Google Go aufgesetzten, leichtgewichtigen Log-Shipper, mit denen Logmessages auf Servern direkt nach ihrer Entstehung eingesammelt und an Logstash oder direkt an Elasticsearch weitergeschickt werden können – auch ganz ohne Logstash-Instanz in der Pipeline. Dazu gehört das hier im Folgenden besprochene Filebeat für Serverlogs. Andere Beispiele sind der Packetbeat für Netzwerkdaten und Metricbeat für Metriken, wobei einige Beats auch Aufgaben aus dem Bereich des Monitorings übernehmen. Der Trend geht dahin, dass die Beats weiter ausgebaut werden und immer mehr von der Funktionalität von Logstash übernehmen. So kann Filebeat nun auch schon Multiline-Logmessages zusammenfassen, und die eingebauten Module für bestimmte Standardapplikationen wie Apache2, NGINX oder MongoDB indizieren Logmessages direkt, ohne dass ein Logstash-Filter dafür aufgesetzt werden muss – allerdings auf Kosten der Flexibilität.

Das Beats-Protokoll für den Transport von eingelesenen Logmessages im ELK-Stack ist robust. So wird die Übertragungsleistung zum Beispiel automatisch gedrosselt, wenn Kapazitätsengpässe aus der Pipeline zurückgemeldet werden. Bei den Komponenten ist dafür gesorgt, dass auch bei Hochlast keine Logmeldungen (in Elastic-Sprech „Event-Messages“ genannt) verloren gehen.

Die Elastic-Stack-Komponenten sind Open Source. Sie stehen in ihrer einfachen Fassung unter der Apache-2.0-Lizenz und sind ohne Lizenzkosten einsetzbar, freilich ohne Anspruch auf Support vom Hersteller. Die Versionsnummer von Elasticsearch (aktuell: 7.2) bestimmt immer die Version des gesamten Stacks mit seinen Komponenten. Es gibt allerdings einen gewissen Spielraum bei der Kombination unterschiedlicher Versionen, sodass ein bestehendes Set-up schrittweise aktualisiert werden kann.

Listing 1: docker-compose.yml

version: '2.4' services: nginx: image: nginx:latest ports: - "8080:80" volumes: - ./log:/var/log/nginx filebeat: image: docker.elastic.co/beats/filebeat:7.2.0 volumes: - ./log/:/var/log/nginx command: > ./filebeat -e -c /etc/motd -E "filebeat.inputs=[{type:log,paths:['/var/log/nginx/access.log']}]" -E "output.logstash.hosts=['logstash:5044']" logstash: image: docker.elastic.co/logstash/logstash:7.2.0 expose: - "5044" volumes: - ./logstash:/usr/share/logstash/pipeline elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0 ports: - "9200:9200" environment: http.host: 0.0.0.0 discovery.type: single-node ES_JAVA_OPTS: "-Xms750m -Xmx750m" kibana: image: docker.elastic.co/kibana/kibana:7.2.0 ports: - "5601:5601"

Beispiel-Set-up

Ein einfaches Beispiel soll demonstrieren, wie Sie mit Filebeat und Logstash eine Log Shipping Pipeline aufsetzen können, um die Zugriffslogs eines NGINX-Webservers (access.log) in Elasticsearch hineinzubekommen, um dort dann darauf zugreifen zu können. Der Elastic Stack ist beim Hersteller in verschiedenen Formaten, wie zum Beispiel DEB- und RPM-Paketen, verfügbar. In diesem Artikel soll es darum gehen, wie sich die Komponenten für eine solche Pipeline aus Docker-Containern heraus betreiben lassen. Das Set-up ist eine Konfigurationsdatei für Docker Compose [5] (Listing 1), in dem alle beteiligten Services inklusive NGINX definiert sind. Sie können das gesamte Gebilde ganz einfach mit dem Befehl docker-compose up -d hochziehen und in Betrieb nehmen.

Obwohl hier aus Platzgründen nicht ausführlich auf Kibana eingegangen werden kann, umfasst das Beispiel-Set-up auch den Container dieser Auswertungsplattform. Die Elastic-Komponenten werden – falls lokal noch nicht vorhanden – beim Hochfahren aus der Container-...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang