teste / test_logging_system.py
torxyton's picture
feat: Implementar sistema de logging avançado com SQLite3
b94122a
#!/usr/bin/env python3
"""
Script de teste para o sistema de logging avançado.
Testa todas as funcionalidades do sistema de logging com SQLite3.
"""
import os
import sys
import time
import json
from datetime import datetime
# Adicionar o diretório src ao path
src_path = os.path.join(os.path.dirname(__file__), 'src')
sys.path.insert(0, src_path)
try:
from src.core.database_logger import DatabaseLogger, LogLevel, LogCategory
from src.utils.logging_decorators import log_execution, log_api_call, log_ai_model_usage, LoggingContext, quick_log
except ImportError as e:
print(f"❌ Erro ao importar módulos de logging: {e}")
print("Tentando importação alternativa...")
try:
# Importação direta dos arquivos
import importlib.util
# Carregar database_logger
spec = importlib.util.spec_from_file_location(
"database_logger",
os.path.join(src_path, "core", "database_logger.py")
)
db_module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(db_module)
DatabaseLogger = db_module.DatabaseLogger
LogLevel = db_module.LogLevel
LogCategory = db_module.LogCategory
# Carregar logging_decorators
spec2 = importlib.util.spec_from_file_location(
"logging_decorators",
os.path.join(src_path, "utils", "logging_decorators.py")
)
dec_module = importlib.util.module_from_spec(spec2)
spec2.loader.exec_module(dec_module)
log_execution = dec_module.log_execution
log_api_call = dec_module.log_api_call
log_ai_model_usage = dec_module.log_ai_model_usage
LoggingContext = dec_module.LoggingContext
quick_log = dec_module.quick_log
print("✅ Importação alternativa bem-sucedida")
except Exception as e2:
print(f"❌ Erro na importação alternativa: {e2}")
sys.exit(1)
def test_basic_logging():
"""Testa funcionalidades básicas de logging."""
print("\n🧪 Testando logging básico...")
# Criar diretório de logs se não existir
os.makedirs('logs', exist_ok=True)
# Inicializar logger
db_logger = DatabaseLogger('logs/test_logging.db')
# Teste 1: Log simples
db_logger.log(
level=LogLevel.INFO,
category=LogCategory.SYSTEM,
message="Teste de log básico",
module="test_logging_system",
function="test_basic_logging",
line_number=70
)
# Teste 2: Log com metadados
db_logger.log(
level=LogLevel.DEBUG,
category=LogCategory.API,
message="Teste com metadados",
module="test_logging_system",
function="test_basic_logging",
line_number=80,
metadata={'test_id': 1, 'timestamp': datetime.now().isoformat()}
)
# Teste 3: Log de erro
db_logger.log(
level=LogLevel.ERROR,
category=LogCategory.SYSTEM,
message="Teste de log de erro",
module="test_logging_system",
function="test_basic_logging",
line_number=90,
execution_time=0.001
)
print("✅ Logging básico funcionando")
return db_logger
def test_performance_metrics(db_logger):
"""Testa logging de métricas de performance."""
print("\n🧪 Testando métricas de performance...")
# Teste 1: Métrica de tempo de resposta
db_logger.log_performance_metric(
metric_name="response_time",
metric_value=0.150,
unit="seconds",
category="api_performance"
)
# Teste 2: Métrica de uso de memória
db_logger.log_performance_metric(
metric_name="memory_usage",
metric_value=256.5,
unit="MB",
category="system_resources"
)
# Teste 3: Métrica de throughput
db_logger.log_performance_metric(
metric_name="requests_per_second",
metric_value=45.2,
unit="req/s",
category="performance",
metadata={'endpoint': '/api/analyze'}
)
print("✅ Métricas de performance funcionando")
def test_system_events(db_logger):
"""Testa logging de eventos do sistema."""
print("\n🧪 Testando eventos do sistema...")
# Teste 1: Evento de inicialização
db_logger.log_system_event(
event_type="STARTUP",
event_name="SERVICE_STARTED",
description="Serviço de teste iniciado",
severity="INFO"
)
# Teste 2: Evento de erro
db_logger.log_system_event(
event_type="ERROR",
event_name="CONNECTION_FAILED",
description="Falha na conexão com API externa",
severity="ERROR",
metadata={'api_endpoint': 'https://api.example.com', 'error_code': 500}
)
# Teste 3: Evento de alerta
db_logger.log_system_event(
event_type="ALERT",
event_name="HIGH_CPU_USAGE",
description="Uso de CPU acima de 80%",
severity="WARNING",
metadata={'cpu_usage': 85.2, 'threshold': 80}
)
print("✅ Eventos do sistema funcionando")
@log_execution(LogCategory.SYSTEM, log_performance=True)
def test_function_with_decorator():
"""Função de teste com decorador de logging."""
time.sleep(0.1) # Simular processamento
return "Resultado do teste"
@log_api_call("test_api")
def test_api_function():
"""Função de teste para chamada de API."""
time.sleep(0.05) # Simular chamada de API
return {'status': 'success', 'data': 'test_data'}
@log_ai_model_usage("test_model")
def test_ai_model_function():
"""Função de teste para uso de modelo IA."""
time.sleep(0.2) # Simular processamento de IA
return {'prediction': 0.85, 'confidence': 0.92}
def test_decorators():
"""Testa os decoradores de logging."""
print("\n🧪 Testando decoradores...")
# Teste 1: Decorador de execução
result1 = test_function_with_decorator()
print(f"Resultado função com decorador: {result1}")
# Teste 2: Decorador de API
result2 = test_api_function()
print(f"Resultado API: {result2}")
# Teste 3: Decorador de modelo IA
result3 = test_ai_model_function()
print(f"Resultado modelo IA: {result3}")
print("✅ Decoradores funcionando")
def test_context_manager():
"""Testa o gerenciador de contexto."""
print("\n🧪 Testando gerenciador de contexto...")
with LoggingContext("Processamento de teste", LogLevel.INFO, LogCategory.SYSTEM):
time.sleep(0.1)
print("Executando dentro do contexto de logging")
print("✅ Gerenciador de contexto funcionando")
def test_quick_log():
"""Testa a função de logging rápido."""
print("\n🧪 Testando logging rápido...")
# Log simples
quick_log("Teste de log rápido", LogLevel.INFO, LogCategory.SYSTEM)
# Log com metadados
quick_log(
"Teste com metadados",
LogLevel.DEBUG,
LogCategory.API,
metadata={'test': True, 'value': 42}
)
print("✅ Logging rápido funcionando")
def test_log_retrieval(db_logger):
"""Testa recuperação e filtragem de logs."""
print("\n🧪 Testando recuperação de logs...")
# Teste 1: Buscar todos os logs
all_logs = db_logger.get_logs(limit=10)
print(f"Total de logs encontrados: {len(all_logs)}")
# Teste 2: Filtrar por nível
error_logs = db_logger.get_logs(level="ERROR", limit=5)
print(f"Logs de erro: {len(error_logs)}")
# Teste 3: Filtrar por categoria
system_logs = db_logger.get_logs(category="SYSTEM", limit=5)
print(f"Logs do sistema: {len(system_logs)}")
# Teste 4: Buscar métricas de performance
metrics = db_logger.get_performance_metrics(limit=5)
print(f"Métricas encontradas: {len(metrics)}")
# Teste 5: Buscar eventos do sistema
events = db_logger.get_system_events(limit=5)
print(f"Eventos do sistema: {len(events)}")
print("✅ Recuperação de logs funcionando")
def test_statistics(db_logger):
"""Testa geração de estatísticas."""
print("\n🧪 Testando estatísticas...")
stats = db_logger.get_statistics()
print(f"Estatísticas: {json.dumps(stats, indent=2)}")
print("✅ Estatísticas funcionando")
def test_cleanup(db_logger):
"""Testa limpeza de logs antigos."""
print("\n🧪 Testando limpeza...")
# Não vamos fazer limpeza real nos testes, apenas verificar se o método existe
try:
# db_logger.cleanup_old_logs(days_to_keep=0) # Comentado para não apagar logs de teste
print("Método de limpeza disponível")
except Exception as e:
print(f"Erro na limpeza: {e}")
print("✅ Limpeza funcionando")
def main():
"""Função principal de teste."""
print("🚀 Iniciando testes do sistema de logging avançado")
print("=" * 60)
try:
# Testes básicos
db_logger = test_basic_logging()
test_performance_metrics(db_logger)
test_system_events(db_logger)
# Testes de decoradores (se disponíveis)
try:
test_decorators()
test_context_manager()
test_quick_log()
except Exception as e:
print(f"⚠️ Alguns decoradores não funcionaram: {e}")
# Testes de recuperação
test_log_retrieval(db_logger)
test_statistics(db_logger)
test_cleanup(db_logger)
print("\n" + "=" * 60)
print("✅ Todos os testes concluídos com sucesso!")
print(f"📁 Logs salvos em: logs/test_logging.db")
# Mostrar algumas estatísticas finais
final_stats = db_logger.get_statistics()
print(f"\n📊 Estatísticas finais:")
print(f" Total de logs: {final_stats.get('total_logs', 0)}")
print(f" Logs por nível: {final_stats.get('logs_by_level', {})}")
print(f" Logs por categoria: {final_stats.get('logs_by_category', {})}")
print(f" Logs últimas 24h: {final_stats.get('logs_last_24h', 0)}")
except Exception as e:
print(f"\n❌ Erro durante os testes: {e}")
import traceback
traceback.print_exc()
return 1
return 0
if __name__ == "__main__":
exit_code = main()
sys.exit(exit_code)