ELK Stack pour stocker les journaux des applications Django

Chacun des projets dépassant l'étape du prototype doit organiser la journalisation. Une journalisation appropriée résout de nombreux problèmes et aide à comprendre l'état du projet. Au stade initial, l'enregistrement dans un fichier me convenait jusqu'à ce que le projet se développe et que la recherche par journaux ne commence pas à prendre du temps.


La solution était de créer un référentiel de journaux centralisé avec agrégation des journaux et recherche. Le choix s'est porté sur la pile ELK. ELK est une combinaison de trois projets OpenSource: ElasticSearch, Logstash et Kibana. ELK stocke les journaux, crée des graphiques et la recherche en texte intégral avec filtres est prise en charge. L'article décrit le processus de configuration de la pile ELK pour le stockage des journaux des applications Django.


Installation ELK


Docker sera utilisé pour installer la pile ELK, sur la base du référentiel docker-elk . Modifiez le paramètre Logstash, ajoutez le modèle GROK pour faire correspondre les journaux nginx et modifiez la section de sortie afin que les journaux d'application Django et les journaux nginx soient stockés dans différents index ElasticSearch. Par conséquent, logstash.conf ressemble à ceci:


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" } } } 

Après avoir apporté les modifications, exécutez la pile:


 docker-compose up 

Après le démarrage, la pile écoute sur les ports suivants:


  • 5000: entrée TCP Logstash.
  • 9200: Elasticsearch HTTP
  • 9300: Transport TCP Elasticsearch
  • 5601: Kibana

Architecture de journalisation


Considérez l'architecture de journalisation d'une application Django.


image


Comme vous pouvez le voir sur le diagramme, l'application se compose de services: nginx, application django, céleri travailleur. Chacun des services a envoyé des journaux à la pile ELK. Pensez à configurer chaque service individuellement.


Écriture des journaux Nginx dans ELK


Pour travailler avec les journaux nginx, un service Filebeat supplémentaire est requis. Le processus d'installation de Filebeat est décrit en détail sur le site officiel . Exemple d'installation du service Filebeat sur un serveur Ubuntu:


 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 lira les journaux du fichier et les enverra à Logstash. Exemple de configuration:


 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"] 

Nous lançons notre service Filebeat et observons l'apparition de journaux dans Kibana.


Écriture des journaux Django dans ELK


Pour que Django interagisse avec le service Logstash, installez le package Python-logstash facultatif.


 pip install python-logstash 

Modifions les paramètres de l'application Django pour que les journaux soient envoyés au service Logstash.


 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, }, ... } } 

Après cela, l'application enverra des journaux à Logstash. Exemple d'utilisation:


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

Après cela, configurez Kibana pour afficher les informations nécessaires. Exemples de captures d'écran de vos propres paramètres:


image
image
image


Le système collecte les journaux de service, vous permet de les rechercher facilement, de créer des graphiques et des visualisations, ce qui vous permet de détecter et de résoudre rapidement les problèmes.

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


All Articles