Sistema de Logger Global¶
O Stride Framework possui um sistema de logging global simples e poderoso. Você nunca mais precisa usar logging.getLogger() diretamente.
Compatível com Uvicorn: O sistema preserva as logs do Uvicorn (incluindo logs de requests HTTP) e apenas ajusta os níveis conforme configurado.
Uso Básico¶
Importe e Use Diretamente¶
from strider import logger
logger.debug("Debug message")
logger.info("Info message")
logger.warning("Warning message")
logger.error("Error message")
logger.critical("Critical message")
Logger com Nome Customizado¶
from strider.logger import get_logger
logger = get_logger("my_module")
logger.info("Hello from my_module")
# Saída: 2024-01-15 10:30:45 - my_module - INFO - Hello from my_module
Configuração¶
Via Settings (Recomendado)¶
from strider.config import Settings, configure
class AppSettings(Settings):
log_level: str = "DEBUG" # DEBUG, INFO, WARNING, ERROR, CRITICAL
log_format: str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
log_json: bool = False # True para formato JSON
configure(settings_class=AppSettings)
Via Variáveis de Ambiente¶
# .env
LOG_LEVEL=DEBUG
LOG_FORMAT="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
LOG_JSON=false
Por que DEBUG não sume mais?¶
O problema com logging.getLogger() é que loggers filhos nem sempre herdam o nível do root logger. Nosso sistema garante que:
- Configuração única: O logging é configurado UMA VEZ no startup
- Nível global: Todos os loggers respeitam o nível configurado
- Propagation: Loggers filhos automaticamente usam o nível do root
Uso em Projetos¶
Exporte para uso em projetos externos¶
# No __init__.py do seu projeto
from strider import logger, get_logger
__all__ = ["logger", "get_logger"]
Em qualquer arquivo do seu projeto¶
from strider import logger
def minha_funcao():
logger.debug("Entrando na função")
# ... código ...
logger.info("Processo concluído")
Formato JSON¶
Para logs estruturados (útil para ELK, Datadog, etc):
configure_logging(level="INFO", json_format=True)
Saída:
{"timestamp": "2024-01-15 10:30:45", "level": "INFO", "name": "strider", "message": "Hello"}
API¶
logger¶
Logger padrão exportado. Use: from strider import logger
get_logger(name: str) -> Logger¶
Retorna um logger com nome customizado.
from strider.logger import get_logger
logger = get_logger("myapp.models")
configure_logging()¶
Configura o sistema de logging (normalmente chamado automaticamente).
from strider.logger import configure_logging
configure_logging(
level="DEBUG",
log_format="%(asctime)s - %(levelname)s - %(message)s",
json_format=False,
force=True # Reconfigurar se já estiver configurado
)
Compatibilidade¶
Com Uvicorn¶
O sistema preserva a configuração de logging do Uvicorn. As logs de requests HTTP continuam funcionando normalmente:
INFO: 127.0.0.1:58234 - "GET /api/users HTTP/1.1" 200 OK
DEBUG: 127.0.0.1:58234 - "GET /api/users HTTP/1.1" 200 OK # com DEBUG=True
Quando você define LOG_LEVEL=DEBUG, as logs do Uvicorn também mudam para DEBUG automaticamente.
Com código existente¶
O sistema é compatível com código existente que usa logging.getLogger():
import logging
# Isso ainda funciona porque configuramos o root logger
old_logger = logging.getLogger("old_module")
old_logger.info("Funciona!")
Diferenças do logging padrão¶
| Aspecto | logging padrão | Stride Logger |
|---|---|---|
| Configuração | Cada módulo faz a própria | Centralizada |
| Nível DEBUG | Frequentemente "some" | Sempre visível quando configurado |
| Setup | Múltiplas chamadas | Uma chamada no startup |
| Uso | logging.getLogger(__name__) |
from strider import logger |