0/24
1/24
Por que analizar logs?
ELK stack
Gerando logs na sua aplicação
Arquitetura
2/24
3/24
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
7/24
Logstash | elastic search | kibana
8/24
9/24
Ferramenta de parseamento de logs
10/24
# 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
Search Server
12/24
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
Interface web para visualizar seus logs
14/24
{'asctime': '2015-05-29 20:42:07,626',
'json': {'duration': 0.002637147903442383,
'path': '/api/get_token_data',
'user': 'someuser'},
'levelname': 'INFO'}
15/24
16/24
#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
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
}}}
19/24
20/24
21/24
22/24
23/24