ELK Stack para armazenar logs de aplicativos Django

Cada um dos projetos que supera o estágio de protótipo precisa organizar o log. O registro adequado resolve muitos problemas e ajuda a entender o status do projeto. No estágio inicial, o registro em um arquivo era adequado para mim até que o projeto crescesse e a pesquisa por registros não demorasse.


A solução foi criar um repositório de logs centralizado com agregação de logs e pesquisa. A escolha caiu na pilha ELK. O ELK é uma combinação de três projetos OpenSource: ElasticSearch, Logstash e Kibana. O ELK armazena logs, cria gráficos e há suporte para pesquisa de texto completo com filtros. O artigo descreve o processo de configuração da pilha ELK para armazenar logs de aplicativos Django.


Instalação ELK


O Docker será usado para instalar a pilha ELK, com base no repositório docker-elk . Altere a configuração Logstash, adicione o padrão GROK para os registros nginx correspondentes e altere a seção de saída para que os logs do aplicativo Django e os nginx sejam armazenados em diferentes índices do ElasticSearch. Como resultado, o logstash.conf fica assim:


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

Após fazer as alterações, execute a pilha:


 docker-compose up 

Após o início, a pilha escuta nas seguintes portas:


  • 5000: Entrada TCP Logstash.
  • 9200: HTTP do Elasticsearch
  • 9300: Transporte TCP do Elasticsearch
  • 5601: Kibana

Arquitetura de Log


Considere a arquitetura de log de um aplicativo Django.


imagem


Como você pode ver no diagrama, o aplicativo consiste em serviços: nginx, aplicativo django, trabalhador de aipo. Cada um dos serviços enviou logs para a pilha ELK. Considere configurar cada serviço individualmente.


Gravando logs do Nginx no ELK


Para trabalhar com logs nginx, é necessário um serviço Filebeat adicional. O processo de instalação do Filebeat é descrito em detalhes no site oficial . Exemplo de instalação do serviço Filebeat em um 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 

O Filebeat lê os logs do arquivo e envia para o Logstash. Exemplo de configuração:


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

Lançamos nosso serviço Filebeat e observamos a aparência de logs no Kibana.


Escrevendo logs do Django no ELK


Para que o Django interaja com o serviço Logstash, instale o pacote opcional Python-logstash .


 pip install python-logstash 

Vamos mudar as configurações do aplicativo Django para que os logs sejam enviados ao serviço 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, }, ... } } 

Depois disso, o aplicativo enviará logs para o Logstash. Exemplo de uso:


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

Depois disso, configure o Kibana para exibir as informações necessárias. Exemplos de capturas de tela de suas próprias configurações:


imagem
imagem
imagem


O sistema coleta logs de serviço, permite procurar convenientemente por eles, criar gráficos e visualizações, permitindo detectar e corrigir problemas rapidamente.

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


All Articles