O logging é um recurso fundamental no desenvolvimento de software, permitindo a coleta e análise de logs para diagnóstico de problemas e melhorias contínuas das aplicações. Com o aumento da complexidade dos sistemas e a crescente demanda por escalabilidade e desempenho, a gestão eficaz dos logs se tornou uma preocupação central nos times de desenvolvimento.
Essa relevância é ainda maior com a adoção de práticas como DevOps e Continuous Integration/Continuous Deployment (CI/CD), que enfatizam a automação e integração contínuas para entrega contínua de valor aos usuários. Nesse contexto, um logging estruturado garante que as informações coletadas sejam precisas, consistentes e fáceis de consumir, contribuindo para a resiliência dos sistemas e reduzindo o tempo de resposta em caso de falhas.
Este artigo abordará as boas práticas de logging estruturado, fornecendo orientações e dicas para implementar e gerenciar logs efetivamente em aplicações. Você aprenderá sobre padrões de logging, formatação de mensagens, armazenamento de dados e integração com ferramentas de monitoramento, além das melhores práticas para garantir a integridade dos logs e facilitar sua análise e uso.
A importância do logging
Logging, também conhecido como registo de eventos, é a prática de capturar informações sobre as atividades realizadas em uma aplicação, incluindo erros, requisições HTTP, operações de banco de dados e outros eventos significativos. Essas informações são então armazenadas em um arquivo ou banco de dados para fins de análise posterior.
A importância do logging é fundamental para garantir a saúde e a estabilidade da aplicação. Com um sistema de logging eficaz, é possível:
- Diagnosticar problemas rapidamente, reduzindo o tempo de inatividade da aplicação;
- Identificar padrões de comportamento anormal ou potencialmente perigosos, como ataques cibernéticos;
- Medir o desempenho e a performance da aplicação, permitindo ajustes para melhorar a experiência do usuário;
- Compreender os erros e exceções que ocorrem durante a execução da aplicação, facilitando a resolução de problemas.
Além disso, um sistema de logging estruturado é essencial para atender aos requisitos de governança e compliance em ambientes de produção, onde a capacidade de realizar auditorias e rastrear eventos é crítica.
Como ele funciona, realmente?
Um sistema de logging estruturado geralmente envolve as seguintes etapas:
Configuração do Logging
- Nível de log: Definir os níveis de log para a aplicação, como DEBUG, INFO, WARNING, ERROR e CRITICAL.
- Formato das mensagens: Especificar o formato das mensagens de log, incluindo campos obrigatórios como timestamp, mensagem, nível de log e ID da requisição.
- Rotinas de log: Definir as rotinas de log para registrar eventos específicos, como conexão ao banco de dados ou envio de emails.
Captura e Processamento dos Logs
- Captura das mensagens de erro: Registrar exceções e erros que ocorram durante a execução da aplicação.
- Armazenamento em um arquivo: Escrever as mensagens de log em um arquivo, como um arquivo de texto ou um banco de dados.
- Integração com ferramentas de monitoramento: Enviar logs para ferramentas de monitoramento para análise e visualização.
Armazenamento e Consulta
- Banco de dados para logs: Utilizar um banco de dados específico para armazenar os logs, permitindo consultas eficientes.
- Arquivo de logs rotativo: Utilizar arquivos de log rotativos para evitar problemas de espaço em disco e garantir a integridade dos logs.
- Backup dos logs: Fazer backups regulares dos logs para garantir que as informações importantes não sejam perdidas.
Monitoramento e Análise
- Tabelas de consulta: Criar tabelas para consultar os logs facilmente, permitindo a extração de dados específicos.
- Relatórios personalizados: Utilizar ferramentas de monitoramento para criar relatórios personalizados sobre o comportamento da aplicação.
- Detecção de padrões anormais: Utilizar algoritmos para detectar padrões anormais no comportamento da aplicação, indicando possíveis problemas ou ataques.
Idealizando o conceito
Neste exemplo, vamos criar um sistema de log para uma aplicação web utilizando Python e o framework Flask.
import logging.config
from flask import Flask
app = Flask(__name__)
logging_config.dictConfig({
'version': 1,
'formatters': {
'default': {
'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s'
}
},
'handlers': {
'wsgi': {
'class': 'logging.StreamHandler',
'stream': 'ext://flask.logging.wsgi_errors_stream',
'formatter': 'default'
}
},
'root': {
'level': 'DEBUG',
'handlers': ['wsgi']
}
})
logger = logging.getLogger(__name__)
@app.route('/')
def index():
# registrar um log de informações
logger.info('Visita à página inicial')
return 'Página inicial'
if __name__ == '__main__':
app.run(debug=True)
from flask import Flask, request
import logging
app = Flask(__name__)
logger = logging.getLogger(__name__)
@app.route('/log', methods=['POST'])
def log_request():
# registrar o corpo da requisição
data = request.get_json()
logger.info('Requisição recebida: %s', data)
return 'Log registrado com sucesso!'
if __name__ == '__main__':
app.run(debug=True)
Este exemplo demonstra como configurar um sistema de log em uma aplicação web utilizando Python e Flask. Além disso, mostra como registrar logs de informações e erros utilizando a biblioteca logging do Python.
Sugestões
Registrar logs apenas para erros e informações críticas
- Evite registrar logs para todos os eventos, pois isso pode sobrecarregar a infraestrutura de log e dificultar a busca por informações importantes.
- Registre apenas os logs mais relevantes, como erros e exceções, além de informações críticas sobre o funcionamento da aplicação.
Utilizar um formato padronizado para logs
- Defina um formato padrão para os logs que inclua informações necessárias, como data/hora, nível de log, módulo e mensagem.
- Isso facilita a busca e a análise dos logs.
Utilizar handlers adequados para logs
- Use handlers adequados para enviar logs para diferentes destinos, como arquivos, consoles ou sistemas de monitoramento.
- Isso permite controlar o fluxo de log e garantir que os logs sejam sempre disponibilizados onde eles forem necessários.
Registrar logs em um repositório de logs centralizado
- Utilize um sistema de log centralizado para registrar todos os logs da aplicação, incluindo os gerados nas diferentes instâncias.
- Isso facilita a busca e a análise dos logs, além de garantir que todos os logs sejam sempre disponibilizados.
Utilizar autenticação e autorização no acesso aos logs
- Defina políticas de segurança para o acesso aos logs, incluindo autenticação e autorização.
- Isso garante que apenas as pessoas com permissão possam acessar os logs e realizar ações neles.
Registrar logs em um nível muito alto
- Evite registrar logs em um nível muito alto, como DEBUG, para todos os eventos.
- Isso pode sobrecarregar a infraestrutura de log e dificultar a busca por informações importantes.
Não utilizar a biblioteca padrão do Python para logging
- Use a biblioteca padrão do Python para logging, pois ela é fácil de usar e fornece muitas funcionalidades úteis.
- Outras bibliotecas podem não ser tão eficientes ou podem ter limitações importantes.
Não configurar o log com uma única linha de código
- Configurar o sistema de log com apenas uma linha de código pode causar problemas e dificultar a manutenção do sistema.
- Configure o sistema de log com cuidado, utilizando múltiplas linhas de código para configurar os handlers e formatação.
Não utilizar um formato padronizado para logs
- Defina um formato padrão para os logs que inclua informações necessárias.
- Isso facilita a busca e a análise dos logs.
Revisando o aprendizado
Para implementar boas práticas de logging estruturado, é importante utilizar um sistema de log centralizado e configurá-lo adequadamente. Além disso, é crucial definir políticas de segurança para o acesso aos logs e utilizar a biblioteca padrão do Python para logging.
Essas medidas ajudam a garantir que os logs sejam registrados corretamente e possíveis erros ou problemas sejam identificados facilmente.
Próximos passos incluem revisar as políticas de segurança atualizadas e considerar implementar monitoramento e análise de log para melhorar a visibilidade dos problemas da aplicação.
Referências
- Fowler, M. Logging, Dependencies and Single Responsibility Principle. Disponível em: https://martinfowler.com/bliki/Logger.html#id-LoggingDependenciesandSingleResponsibilityPrinciple. Acesso: 2024.
- Python Documentation - Logging HOWTO. Disponível em: https://docs.python.org/3/howto/logging.html. Acesso: 2024.
- Python Documentation - Configuring Logging for a Library. Disponível em: https://docs.python.org/3/library/logging.config.html#configuring-logging-for-a-library. Acesso: 2024.
- OWASP. Logging Cheat Sheet. Disponível em: https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html. Acesso: 2024.
- 12factor.net. Logs. Disponível em: https://12factor.net/logs. Acesso: 2024.