ELK-Stapel zum Speichern von Django-Anwendungsprotokollen

Jedes der Projekte, die über die Prototypenphase hinauswachsen, muss die Protokollierung organisieren. Die ordnungsgemäße Protokollierung löst viele Probleme und hilft, den Status des Projekts zu verstehen. In der Anfangsphase passte die Protokollierung in eine Datei zu mir, bis das Projekt wuchs und die Suche nach Protokollen keine Zeit in Anspruch nahm.


Die Lösung bestand darin, ein zentrales Protokollrepository mit Aggregation von Protokollen und Suche zu erstellen. Die Wahl fiel auf den ELK-Stack. ELK ist eine Kombination aus drei OpenSource-Projekten: ElasticSearch, Logstash und Kibana. ELK speichert Protokolle, erstellt Diagramme und unterstützt die Volltextsuche mit Filtern. Der Artikel beschreibt den Vorgang zum Einrichten des ELK-Stacks zum Speichern von Django-Anwendungsprotokollen.


ELK Installation


Docker wird verwendet, um den ELK-Stack basierend auf dem Docker-Elk- Repository zu installieren. Ändern Sie die Logstash-Einstellung, fügen Sie das GROK-Muster für übereinstimmende Nginx-Protokolle hinzu und ändern Sie den Ausgabeabschnitt so, dass die Django-Anwendungsprotokolle und Nginx-Protokolle in verschiedenen ElasticSearch-Indizes gespeichert werden. Infolgedessen sieht logstash.conf folgendermaßen aus:


input { beats { port => 5000 host => "0.0.0.0" } } filter { if [type] == "nginx" { grok { match => { "message" => "%{IPORHOST:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:access_time}\] \"%{WORD:http_method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent_bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\"" } } } } output { if [type] == "nginx" { elasticsearch { hosts => "elasticsearch:9200" index => "nginx-%{+YYYY.MM.dd}" } } else if [type] == "django" { elasticsearch { hosts => "elasticsearch:9200" index => "django-%{+YYYY.MM.dd}" } } else { elasticsearch { hosts => "elasticsearch:9200" index => "unknown_messages" } } } 

Führen Sie nach dem Vornehmen der Änderungen den Stapel aus:


 docker-compose up 

Nach dem Start überwacht der Stack die folgenden Ports:


  • 5000: Logstash-TCP-Eingang.
  • 9200: Elasticsearch HTTP
  • 9300: Elasticsearch-TCP-Transport
  • 5601: Kibana

Protokollierungsarchitektur


Betrachten Sie die Protokollierungsarchitektur einer Django-Anwendung.


Bild


Wie Sie dem Diagramm entnehmen können, besteht die Anwendung aus folgenden Diensten: Nginx, Django-Anwendung, Sellerie-Arbeiter. Jeder der Dienste hat Protokolle an den ELK-Stapel gesendet. Ziehen Sie in Betracht, jeden Dienst einzeln zu konfigurieren.


Schreiben von Nginx-Protokollen in ELK


Um mit Nginx-Protokollen arbeiten zu können, ist ein zusätzlicher Filebeat-Dienst erforderlich. Der Installationsprozess für Filebeat wird auf der offiziellen Website ausführlich beschrieben. Beispiel für die Installation des Filebeat-Dienstes auf einem Ubuntu-Server:


 curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.0-amd64.deb sudo dpkg -i filebeat-6.4.0-amd64.deb 

Filebeat liest die Protokolle aus der Datei und sendet sie an Logstash. Konfigurationsbeispiel:


 filebeat.inputs: - type: log enabled: true paths: - /var/log/nginx/access.log fields: type: nginx fields_under_root: true scan_frequency: 5s output.logstash: hosts: ["logstash:5000"] 

Wir starten unseren Filebeat-Service und beobachten das Auftreten von Protokollen in Kibana.


Schreiben von Django-Protokollen in ELK


Installieren Sie das optionale Python-logstash-Paket, damit Django mit dem Logstash-Dienst interagieren kann .


 pip install python-logstash 

Lassen Sie uns die Einstellungen der Django-Anwendung so ändern, dass die Protokolle an den Logstash-Dienst gesendet werden.


 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'simple': { 'format': 'velname)s %(message)s' }, }, 'handlers': { 'console': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'simple' }, 'logstash': { 'level': 'INFO', 'class': 'logstash.TCPLogstashHandler', 'host': 'logstash', 'port': 5000, 'version': 1, 'message_type': 'django', # 'type'   logstash . 'fqdn': False, 'tags': ['django'], #  . }, }, 'loggers': { 'django.request': { 'handlers': ['logstash'], 'level': 'INFO', 'propagate': True, }, ... } } 

Danach sendet die Anwendung Protokolle an Logstash. Anwendungsbeispiel:


 import logging logger = logging.getLogger(__name__) def test_view(request, arg1, arg): ... if is_error: #    logger.error('Something went wrong!') 

Konfigurieren Sie anschließend Kibana so, dass die erforderlichen Informationen angezeigt werden. Beispiel-Screenshots Ihrer eigenen Einstellungen:


Bild
Bild
Bild


Das System sammelt Serviceprotokolle, ermöglicht Ihnen die bequeme Suche nach diesen Protokollen, die Erstellung von Diagrammen und Visualisierungen, sodass Sie Probleme schnell erkennen und beheben können.

Source: https://habr.com/ru/post/de421819/


All Articles