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