ELK Stack para almacenar registros de aplicaciones de Django

Cada uno de los proyectos que supera la etapa de prototipo necesita organizar el registro. El registro adecuado resuelve muchos problemas y ayuda a comprender el estado del proyecto. En la etapa inicial, iniciar sesión en un archivo me convenía hasta que el proyecto creció y la búsqueda por registros no comenzó a tomar tiempo.


La solución fue crear un repositorio de registros centralizado con agregación de registros y búsqueda. La elección recayó en la pila de ELK. ELK es una combinación de tres proyectos OpenSource: ElasticSearch, Logstash y Kibana. ELK almacena registros, crea gráficos y hay soporte para la búsqueda de texto completo con filtros. El artículo describe el proceso de configuración de la pila ELK para almacenar registros de aplicaciones de Django.


Instalación ELK


Docker se usará para instalar la pila ELK, basada en el repositorio docker-elk . Cambie la configuración de Logstash, agregue el patrón GROK para hacer coincidir los registros nginx y cambie la sección de salida para que los registros de la aplicación Django y los registros nginx se almacenen en diferentes índices de ElasticSearch. Como resultado, logstash.conf se ve así:


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

Después de hacer los cambios, ejecute la pila:


 docker-compose up 

Después de comenzar, la pila escucha en los siguientes puertos:


  • 5000: entrada TCP Logstash.
  • 9200: Elasticsearch HTTP
  • 9300: transporte TCP Elasticsearch
  • 5601: Kibana

Arquitectura de registro


Considere la arquitectura de registro de una aplicación Django.


imagen


Como puede ver en el diagrama, la aplicación consta de servicios: nginx, aplicación django, trabajador de apio. Cada uno de los servicios envió registros a la pila ELK. Considere configurar cada servicio individualmente.


Escribir registros de Nginx en ELK


Para trabajar con registros nginx, se requiere un servicio adicional Filebeat. El proceso de instalación de Filebeat se describe en detalle en el sitio web oficial . Ejemplo de instalación del servicio Filebeat en un servidor 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 leerá los registros del archivo y los enviará a Logstash. Ejemplo de configuración:


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

Lanzamos nuestro servicio Filebeat y observamos la aparición de registros en Kibana.


Escribir registros de Django en ELK


Para que Django interactúe con el servicio Logstash, instale el paquete opcional Python-logstash .


 pip install python-logstash 

Cambiemos la configuración de la aplicación Django para que los registros se envíen al servicio 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, }, ... } } 

Después de eso, la aplicación enviará registros a Logstash. Ejemplo de uso:


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

Después de eso, configure Kibana para que muestre la información necesaria. Capturas de pantalla de ejemplo de su propia configuración:


imagen
imagen
imagen


El sistema recopila registros de servicios, le permite buscarlos cómodamente, crear gráficos y visualizaciones, lo que le permite detectar y solucionar problemas rápidamente.

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


All Articles