Protokollierung mit Elastic Stack
Tipp
Diese Inhalte sind ein Auszug aus dem E-Book „Architecting Cloud Native .NET Applications for Azure“, verfügbar in der .NET-Dokumentation oder als kostenlos herunterladbare PDF-Datei, die offline gelesen werden kann.
Es gibt viele gute Tools für die zentralisierte Protokollierung, und die Kosten variieren von kostenlosen Open-Source-Tools bis hin zu teureren Optionen. In vielen Fällen sind die kostenlosen Tools ebenso gut oder besser als die kostenpflichtigen Angebote. Ein solches Tool ist eine Kombination aus drei Open-Source-Komponenten: Elasticsearch, Logstash und Kibana.
Zusammen werden diese Tools als Elastic Stack oder ELK-Stapel bezeichnet.
Elastic Stack
Elastic Stack ist eine leistungsstarke Option zum Erfassen von Informationen aus einem Kubernetes-Cluster. Kubernetes unterstützt das Senden von Protokollen an einen Elasticsearch-Endpunkt, und Sie müssen im Wesentlichen nur die Umgebungsvariablen festlegen, wie in Abbildung 7-5 gezeigt:
KUBE_LOGGING_DESTINATION=elasticsearch
KUBE_ENABLE_NODE_LOGGING=true
Abbildung 7-5. Konfigurationsvariablen für Kubernetes
In diesem Schritt wird Elasticsearch auf dem Cluster installiert und als Ziel für das Senden aller Clusterprotokolle festgelegt.
Abbildung 7-6 Beispiel für ein Kibana-Dashboard mit den Ergebnissen einer Abfrage für Protokolle, die aus Kubernetes erfasst wurden
Welche Vorteile bietet Elastic Stack?
Elastic Stack bietet eine kostengünstige, skalierbare und cloudfreundliche Möglichkeit zur zentralisierten Protokollierung. In der zugehörigen Benutzeroberfläche ist die Datenanalyse optimiert, damit Sie Ihre Zeit damit verbringen können, Erkenntnisse aus Ihren Daten zu gewinnen, anstatt sich mit einer komplexen Benutzeroberfläche auseinandersetzen zu müssen. Sie unterstützt eine Vielzahl von Eingaben. Auch wenn Ihre verteilte Anwendung mehr und unterschiedliche Arten von Diensten umfasst, sind Sie so weiterhin dazu in der Lage, Protokoll- und Metrikdaten im System zu erfassen. Elastic Stack unterstützt außerdem schnelle Suchvorgänge, sogar über mehrere umfangreiche Datasets, sodass es selbst für große Anwendungen möglich ist, detaillierte Daten zu protokollieren und dennoch auf leistungsstarke Weise Einsicht zu erhalten.
Logstash
Die erste Komponente ist Logstash. Dieses Tool wird verwendet, um Protokollinformationen aus einer Vielzahl verschiedener Quellen zu sammeln. Logstash kann beispielsweise Protokolle vom Datenträger lesen und auch Nachrichten von Protokollierungsbibliotheken wie Serilog empfangen. Logstash kann einige grundlegende Filter- und Erweiterungsfunktionen für die Protokolle durchführen, sobald diese eingehen. Wenn Ihre Protokolle beispielsweise IP-Adressen enthalten, kann Logstash so konfiguriert werden, dass eine geografische Suche durchgeführt und ein Land/eine Region oder sogar die Ursprungsstadt für die jeweilige Nachricht abgerufen wird.
Serilog ist eine Protokollierungsbibliothek für .NET-Sprachen, die eine parametrisierte Protokollierung ermöglicht. Anstatt eine Textprotokollmeldung zu generieren, die Felder einbettet, werden die Parameter getrennt gehalten. Diese Bibliothek ermöglicht eine intelligentere Filterung und Suche. Eine Serilog-Beispielkonfiguration zum Schreiben in Logstash wird in Abbildung 7-7 gezeigt.
var log = new LoggerConfiguration()
.WriteTo.Http("http://localhost:8080")
.CreateLogger();
Abbildung 7-7. Serilog-Konfiguration zum direkten Schreiben von Protokollinformationen in Logstash über HTTP
Für Logstash würde eine Konfiguration wie die in Abbildung 7-8 gezeigte verwendet.
input {
http {
#default host 0.0.0.0:8080
codec => json
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
index=>"sales-%{+xxxx.ww}"
}
}
Abbildung 7-8. Eine Logstash-Konfiguration zum Nutzen von Protokollen aus Serilog
Für Szenarien, in denen keine umfangreiche Protokollbearbeitung erforderlich ist, gibt es eine Alternative zu Logstash, die unter dem Namen Beats bekannt ist. Beats ist eine Familie von Tools, die eine Vielzahl von Daten – von Protokollen bis hin zu Netzwerkdaten und Betriebszeitinformationen – erfassen können. Viele Anwendungen verwenden sowohl Logstash als auch Beats.
Nachdem die Protokolle von Logstash erfasst wurden, müssen sie an einem Ort platziert werden. Logstash unterstützt viele verschiedene Ausgaben, und eine der interessanteren ist Elasticsearch.
Elasticsearch
Elasticsearch ist eine leistungsstarke Suchmaschine, die Protokolle gleich bei ihrem Eintreffen indizieren kann. Dadurch können schnell Abfragen für die Protokolle ausgeführt werden. Elasticsearch kann große Mengen von Protokollen verarbeiten und im Extremfall auf viele Knoten hochskaliert werden.
Protokollmeldungen, die so gestaltet wurden, dass sie Parameter enthalten, oder die über die Logstash-Verarbeitung von Parametern getrennt wurden, können direkt abgefragt werden, da Elasticsearch diese Informationen beibehält.
Abbildung 7-9 zeigt eine Abfrage, die nach den wichtigsten 10 Seiten sucht, die von jill@example.com
besucht wurden.
"query": {
"match": {
"user": "jill@example.com"
}
},
"aggregations": {
"top_10_pages": {
"terms": {
"field": "page",
"size": 10
}
}
}
Abbildung 7-9. Elasticsearch-Abfrage zum Ermitteln der 10 wichtigsten Seiten, die von einem Benutzer besucht wurden
Visualisieren von Informationen mit Kibana-Webdashboards
Die letzte Komponente des Stapels ist Kibana. Dieses Tool wird verwendet, um interaktive Visualisierungen in einem Webdashboard bereitzustellen. Dashboards können auch von Benutzern gestaltet werden, die nicht technisch versiert sind. Die meisten Daten, die im Elasticsearch-Index enthalten sind, können in die Kibana-Dashboards aufgenommen werden. Einzelne Benutzer haben möglicherweise unterschiedliche Präferenzen für ihr Dashboard, und Kibana ermöglicht diese Anpassung durch benutzerspezifische Dashboards.
Installieren von Elastic Stack in Azure
Elastic Stack kann auf viele Arten in Azure installiert werden. Wie üblich ist es möglich, VMs bereitzustellen und Elastic Stack direkt darauf zu installieren. Diese Option wird von einigen erfahrenen Benutzern bevorzugt, da sie das höchste Maß an Anpassungsfähigkeit bietet. Die Bereitstellung als Infrastructure-as-a-Service führt zu einem erheblichen Verwaltungsaufwand, da diejenigen, die sich für diese Lösung entscheiden, die Verantwortung für alle Aufgaben im Zusammenhang mit Infrastructure-as-a-Service übernehmen müssen, z. B. das Sichern der Computer und die Aktualisierung von Patches.
Eine Option mit weniger Aufwand besteht darin, einen der vielen Docker-Container zu verwenden, für die Elastic Stack bereits konfiguriert wurde. Diese Container können in einem vorhandenen Kubernetes-Cluster abgelegt und zusammen mit Anwendungscode ausgeführt werden. Der Container sebp/elk ist ein gut dokumentierter und getesteter Elastic Stack-Container.
Eine weitere Option ist ein kürzlich angekündigtes ELK-as-a-Service-Angebot.