Gerenciando seus logs sem dor de cabeça.

0/24

$ whoami

@IuryAlves

  • Desenvolvedor python - QMágico
  • Cursando Análise e Desenvolvimento de sistemas - Fatec SJC

1/24

  • Por que analizar logs?

  • ELK stack

    • Elastic Search
    • Logstash
    • Kibana
  • Gerando logs na sua aplicação

  • Arquitetura

2/24

Roteiro

Por que analizar logs?

  • Encontrar falhas na aplicação
  • Identificar gargalos
  • Entender como seus usuários estão usando o sistema

3/24

O problema

4/24

5/24





[Mon May 18 20:48:39 2015] return _ConnectionRecord(self)
[Mon May 18 20:48:39 2015] File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 449, in __init__
[Mon May 18 20:48:39 2015]   self.connection = self.__connect()
[Mon May 18 20:48:39 2015]   File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 602, in __connect
[Mon May 18 20:48:39 2015]     connection = self.__pool._invoke_creator(self)
[Mon May 18 20:48:39 2015]   File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/strategies.py", line 97, in connect
[Mon May 18 20:48:39 2015]      return dialect.connect(*cargs, **cparams)
[Mon May 18 20:48:39 2015]    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 377, in connect
[Mon May 18 20:48:39 2015]     return self.dbapi.connect(*cargs, **cparams)
[Mon May 18 20:48:39 2015]  OperationalError: (sqlite3.OperationalError) unable to open database file
tail /var/log/apache2/error.log | pcregrep -M '\[[a-zA-Z]{3}\s+[a-zA-Z]{3}\s+[0-9]{2}.*?'

6/24

Analizar logs via linha de comando não é escalável

 

  • Logs em diversas aplicações
  • logs em diversos arquivos
  • Não automatizado

7/24

ELK stack

Logstash | elastic search | kibana

8/24

O que ELK faz?

  • Coleta os logs em diferentes arquivos e aplicações
  • Indexa
  • Torna seus logs analisáveis

9/24

Logstash

Ferramenta de parseamento de logs

10/24

Logstash

Input | Filter | Output


# Logstash Input

127.0.0.1 GET /admin 500


# Logstash Output
{
   "message": "127.0.0.1 GET /admin 500",
   "ip": "127.0.0.1",
   "method": "GET",
   "request": "/admin",
   "status_code": "500"
}

11/24

Elastic Search

Search Server

  • RESTful
  • Orientado a documentos json

12/24

Elastic Search

curl -XPUT "http://localhost:9200/eventos/python-vale/1" -d '
    {
        "cidade": "São José dos Campos",
        "Linguagem": "Python"
    }'

curl -XGET "http://localhost:9200/eventos/python-vale/1?pretty"
{
  "_index" : "eventos",
  "_type" : "python",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source":
    {
    "cidade": "São José dos Campos",
    "Linguagem": "Python"
    }
}

13/24

Kibana

Interface web para visualizar seus logs

 

14/24

Gerando logs na sua aplicação

Logs no formato json

{'asctime': '2015-05-29 20:42:07,626',
 'json': {'duration': 0.002637147903442383,
          'path': '/api/get_token_data',
          'user': 'someuser'},
 'levelname': 'INFO'}

15/24

Gerando logs na sua aplicação

Logs rotativos

16/24

Gerando logs na sua aplicação

#coding: utf-8

import logging
from logging import handlers
from pythonjsonlogger import jsonlogger

logger = logging.getLogger()
logger.setLevel(logging.NOTSET)
formatter = jsonlogger.JsonFormatter()
handler = handlers.RotatingFileHandler("app.log",
	maxBytes=2000, backupCount=2)
handler.setLevel(logging.NOTSET)
handler.setFormatter(formatter)
logger.addHandler(handler)

17/24

Gerando logs na sua aplicação

LOGGING = {
    'version': 1,
    'formatters': {
        'json_formatter': {
            '()': jsonlogger.JsonFormatter,
            'format': '%(levelname)s %(asctime)s %(message)s'
        }
    },
    'handlers': {
        'log_request_handler': {
            'class': 'logging.handlers.RotatingFileHandler',
            'formatter': 'json_formatter',
            'filename': '/path/to/logs/django_logs.log',
            'maxBytes': 1024 * 1024 * 5,  # 5 MB
            'backupCount': 5,
        }
    },
    'loggers': {
        'log_request': {
            'handlers': ['log_request_handler'],
            'propagate': False
        }}}

Enviando seus logs para o logstash 

 

  • define um tipo para o log
  •  define de onde o log veio
  • envia para o logstash

Logstash forwarder

19/24

Arquitetura

20/24

Arquitetura

21/24

Kibana Dashboard

22/24

Perguntas?

23/24

Gerenciando seus logs sem dor de cabeça

By Iury Alves de Souza

Gerenciando seus logs sem dor de cabeça

  • 467