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.

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:
Après cela, configurez Kibana pour afficher les informations nécessaires. Exemples de captures d'écran de vos propres paramètres:



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.