Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| """ | |
| Script de Configuração - Scripts de Análise de Logs | |
| Este script configura e valida o ambiente para uso dos | |
| scripts de análise de logs, criando aliases e verificando dependências. | |
| Autor: Sistema de Análise de Mercado | |
| Versão: 1.0.0 | |
| """ | |
| import os | |
| import sys | |
| import json | |
| import sqlite3 | |
| from pathlib import Path | |
| from datetime import datetime | |
| import argparse | |
| class LogAnalysisSetup: | |
| """Configurador dos scripts de análise de logs""" | |
| def __init__(self): | |
| self.project_root = Path.cwd() | |
| self.scripts_dir = self.project_root / "scripts" / "log_analysis" | |
| self.logs_dir = self.project_root / "logs" | |
| self.config_file = self.scripts_dir / "config.json" | |
| def print_header(self, title: str): | |
| """Imprime cabeçalho formatado""" | |
| print("\n" + "="*60) | |
| print(f" {title}") | |
| print("="*60) | |
| def print_step(self, step: str, status: str = "INFO"): | |
| """Imprime passo com status""" | |
| icons = { | |
| "INFO": "ℹ️", | |
| "SUCCESS": "✅", | |
| "WARNING": "⚠️", | |
| "ERROR": "❌" | |
| } | |
| print(f"{icons.get(status, 'ℹ️')} {step}") | |
| def check_environment(self) -> bool: | |
| """Verifica o ambiente do projeto""" | |
| self.print_header("VERIFICAÇÃO DO AMBIENTE") | |
| checks = [ | |
| ("Diretório do projeto", self.project_root.exists()), | |
| ("Diretório de scripts", self.scripts_dir.exists()), | |
| ("Diretório de logs", self.logs_dir.exists()), | |
| ("Arquivo app.py", (self.project_root / "app.py").exists()), | |
| ("Arquivo config.py", (self.project_root / "config.py").exists()) | |
| ] | |
| all_good = True | |
| for check_name, result in checks: | |
| status = "SUCCESS" if result else "ERROR" | |
| self.print_step(f"{check_name}: {'OK' if result else 'FALHOU'}", status) | |
| if not result: | |
| all_good = False | |
| return all_good | |
| def check_log_database(self) -> dict: | |
| """Verifica o banco de dados de logs""" | |
| self.print_header("VERIFICAÇÃO DO BANCO DE LOGS") | |
| db_path = self.logs_dir / "application.db" | |
| result = { | |
| "exists": db_path.exists(), | |
| "path": str(db_path), | |
| "tables": [], | |
| "log_count": 0, | |
| "latest_log": None | |
| } | |
| if not result["exists"]: | |
| self.print_step(f"Banco de dados não encontrado: {db_path}", "WARNING") | |
| self.print_step("Execute a aplicação para gerar logs", "INFO") | |
| return result | |
| try: | |
| conn = sqlite3.connect(db_path) | |
| cursor = conn.cursor() | |
| # Verifica tabelas | |
| cursor.execute("SELECT name FROM sqlite_master WHERE type='table'") | |
| result["tables"] = [row[0] for row in cursor.fetchall()] | |
| # Conta logs se a tabela existe | |
| if "logs" in result["tables"]: | |
| cursor.execute("SELECT COUNT(*) FROM logs") | |
| result["log_count"] = cursor.fetchone()[0] | |
| # Pega o log mais recente | |
| cursor.execute("SELECT timestamp, level, message FROM logs ORDER BY timestamp DESC LIMIT 1") | |
| latest = cursor.fetchone() | |
| if latest: | |
| result["latest_log"] = { | |
| "timestamp": latest[0], | |
| "level": latest[1], | |
| "message": latest[2][:100] + "..." if len(latest[2]) > 100 else latest[2] | |
| } | |
| conn.close() | |
| self.print_step(f"Banco de dados encontrado: {db_path}", "SUCCESS") | |
| self.print_step(f"Tabelas: {', '.join(result['tables'])}", "INFO") | |
| self.print_step(f"Total de logs: {result['log_count']}", "INFO") | |
| if result["latest_log"]: | |
| self.print_step(f"Último log: {result['latest_log']['timestamp']} - {result['latest_log']['level']}", "INFO") | |
| except Exception as e: | |
| self.print_step(f"Erro ao verificar banco: {str(e)}", "ERROR") | |
| result["error"] = str(e) | |
| return result | |
| def create_config(self, db_info: dict): | |
| """Cria arquivo de configuração""" | |
| self.print_header("CRIAÇÃO DA CONFIGURAÇÃO") | |
| config = { | |
| "version": "1.0.0", | |
| "created_at": datetime.now().isoformat(), | |
| "project_root": str(self.project_root), | |
| "database": { | |
| "path": db_info["path"], | |
| "exists": db_info["exists"], | |
| "tables": db_info["tables"], | |
| "last_check": datetime.now().isoformat() | |
| }, | |
| "defaults": { | |
| "analysis_hours": 24, | |
| "monitor_interval": 5, | |
| "alert_threshold": 5 | |
| }, | |
| "patterns": { | |
| "critical_keywords": ["ERROR", "CRITICAL", "Exception", "Failed"], | |
| "performance_threshold_ms": 1000, | |
| "import_error_keywords": ["ImportError", "ModuleNotFoundError", "not defined"] | |
| } | |
| } | |
| try: | |
| with open(self.config_file, 'w', encoding='utf-8') as f: | |
| json.dump(config, f, indent=2, ensure_ascii=False) | |
| self.print_step(f"Configuração salva em: {self.config_file}", "SUCCESS") | |
| return True | |
| except Exception as e: | |
| self.print_step(f"Erro ao salvar configuração: {str(e)}", "ERROR") | |
| return False | |
| def create_aliases(self): | |
| """Cria aliases para facilitar o uso""" | |
| self.print_header("CRIAÇÃO DE ALIASES") | |
| aliases_file = self.scripts_dir / "aliases.sh" | |
| aliases_content = f"""#!/bin/bash | |
| # Aliases para Scripts de Análise de Logs | |
| # Gerado automaticamente em {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} | |
| # Diretório base do projeto | |
| PROJECT_ROOT="{self.project_root}" | |
| # Aliases principais | |
| alias log-analyze="python $PROJECT_ROOT/scripts/log_analysis/advanced_log_analyzer.py" | |
| alias log-monitor="python $PROJECT_ROOT/scripts/log_analysis/realtime_monitor.py" | |
| alias log-demo="python $PROJECT_ROOT/scripts/log_analysis/demo.py" | |
| # Aliases com parâmetros comuns | |
| alias log-quick="python $PROJECT_ROOT/scripts/log_analysis/advanced_log_analyzer.py --hours 1 --quiet" | |
| alias log-errors="python $PROJECT_ROOT/scripts/log_analysis/advanced_log_analyzer.py --hours 6 | grep -A10 'ERROS ENCONTRADOS'" | |
| alias log-performance="python $PROJECT_ROOT/scripts/log_analysis/advanced_log_analyzer.py --hours 12 | grep -A10 'PROBLEMAS DE PERFORMANCE'" | |
| alias log-watch="python $PROJECT_ROOT/scripts/log_analysis/realtime_monitor.py --verbose --interval 3" | |
| # Aliases para relatórios | |
| alias log-report-daily="python $PROJECT_ROOT/scripts/log_analysis/advanced_log_analyzer.py --hours 24 --output daily_report.txt" | |
| alias log-report-weekly="python $PROJECT_ROOT/scripts/log_analysis/advanced_log_analyzer.py --hours 168 --output weekly_report.txt" | |
| alias log-export-json="python $PROJECT_ROOT/scripts/log_analysis/advanced_log_analyzer.py --json logs_export.json --quiet" | |
| echo "✅ Aliases de análise de logs carregados!" | |
| echo "📚 Comandos disponíveis:" | |
| echo " log-analyze - Análise completa (24h)" | |
| echo " log-monitor - Monitor em tempo real" | |
| echo " log-quick - Análise rápida (1h)" | |
| echo " log-errors - Foca apenas em erros" | |
| echo " log-performance- Problemas de performance" | |
| echo " log-watch - Monitor detalhado" | |
| echo " log-demo - Demonstração dos scripts" | |
| echo "" | |
| echo "💡 Para usar: source scripts/log_analysis/aliases.sh" | |
| """ | |
| try: | |
| with open(aliases_file, 'w', encoding='utf-8') as f: | |
| f.write(aliases_content) | |
| # Torna o arquivo executável | |
| aliases_file.chmod(0o755) | |
| self.print_step(f"Aliases criados em: {aliases_file}", "SUCCESS") | |
| self.print_step("Para usar: source scripts/log_analysis/aliases.sh", "INFO") | |
| return True | |
| except Exception as e: | |
| self.print_step(f"Erro ao criar aliases: {str(e)}", "ERROR") | |
| return False | |
| def create_batch_scripts(self): | |
| """Cria scripts batch para Windows""" | |
| self.print_header("CRIAÇÃO DE SCRIPTS BATCH (WINDOWS)") | |
| batch_dir = self.scripts_dir / "batch" | |
| batch_dir.mkdir(exist_ok=True) | |
| scripts = { | |
| "analyze.bat": f"@echo off\npython \"{self.project_root}\\scripts\\log_analysis\\advanced_log_analyzer.py\" %*", | |
| "monitor.bat": f"@echo off\npython \"{self.project_root}\\scripts\\log_analysis\\realtime_monitor.py\" %*", | |
| "demo.bat": f"@echo off\npython \"{self.project_root}\\scripts\\log_analysis\\demo.py\" %*", | |
| "quick-check.bat": f"@echo off\npython \"{self.project_root}\\scripts\\log_analysis\\advanced_log_analyzer.py\" --hours 1 --quiet" | |
| } | |
| created_count = 0 | |
| for script_name, content in scripts.items(): | |
| script_path = batch_dir / script_name | |
| try: | |
| with open(script_path, 'w', encoding='utf-8') as f: | |
| f.write(content) | |
| created_count += 1 | |
| self.print_step(f"Criado: {script_name}", "SUCCESS") | |
| except Exception as e: | |
| self.print_step(f"Erro ao criar {script_name}: {str(e)}", "ERROR") | |
| if created_count > 0: | |
| self.print_step(f"Scripts batch criados em: {batch_dir}", "INFO") | |
| self.print_step("Adicione o diretório ao PATH para usar globalmente", "INFO") | |
| return created_count > 0 | |
| def validate_scripts(self): | |
| """Valida se os scripts principais existem e são executáveis""" | |
| self.print_header("VALIDAÇÃO DOS SCRIPTS") | |
| scripts = [ | |
| "advanced_log_analyzer.py", | |
| "realtime_monitor.py", | |
| "demo.py", | |
| "setup.py" | |
| ] | |
| all_valid = True | |
| for script in scripts: | |
| script_path = self.scripts_dir / script | |
| exists = script_path.exists() | |
| if exists: | |
| # Tenta importar para verificar sintaxe | |
| try: | |
| import subprocess | |
| result = subprocess.run( | |
| [sys.executable, "-m", "py_compile", str(script_path)], | |
| capture_output=True, | |
| text=True | |
| ) | |
| syntax_ok = result.returncode == 0 | |
| except: | |
| syntax_ok = False | |
| status = "SUCCESS" if syntax_ok else "WARNING" | |
| self.print_step(f"{script}: {'OK' if syntax_ok else 'Erro de sintaxe'}", status) | |
| if not syntax_ok: | |
| all_valid = False | |
| else: | |
| self.print_step(f"{script}: Não encontrado", "ERROR") | |
| all_valid = False | |
| return all_valid | |
| def run_setup(self, create_aliases: bool = True, create_batch: bool = True): | |
| """Executa configuração completa""" | |
| self.print_header("CONFIGURAÇÃO DOS SCRIPTS DE ANÁLISE DE LOGS") | |
| # Verifica ambiente | |
| if not self.check_environment(): | |
| self.print_step("Ambiente inválido. Não é possível continuar.", "ERROR") | |
| return False | |
| # Verifica banco de logs | |
| db_info = self.check_log_database() | |
| # Cria configuração | |
| if not self.create_config(db_info): | |
| self.print_step("Falha ao criar configuração", "ERROR") | |
| return False | |
| # Valida scripts | |
| if not self.validate_scripts(): | |
| self.print_step("Alguns scripts têm problemas", "WARNING") | |
| # Cria aliases se solicitado | |
| if create_aliases: | |
| self.create_aliases() | |
| # Cria scripts batch se solicitado | |
| if create_batch and os.name == 'nt': # Windows | |
| self.create_batch_scripts() | |
| self.print_header("CONFIGURAÇÃO CONCLUÍDA") | |
| self.print_step("Scripts de análise configurados com sucesso!", "SUCCESS") | |
| # Instruções finais | |
| print("\n📋 Próximos passos:") | |
| print(" 1. Execute 'python scripts/log_analysis/demo.py' para ver exemplos") | |
| print(" 2. Use 'python scripts/log_analysis/advanced_log_analyzer.py --help' para ajuda") | |
| print(" 3. Inicie o monitor com 'python scripts/log_analysis/realtime_monitor.py'") | |
| if create_aliases: | |
| print(" 4. Carregue os aliases: source scripts/log_analysis/aliases.sh") | |
| if db_info["log_count"] == 0: | |
| print("\n⚠️ Aviso: Nenhum log encontrado. Execute a aplicação para gerar dados.") | |
| return True | |
| def main(): | |
| """Função principal""" | |
| parser = argparse.ArgumentParser(description='Configuração dos Scripts de Análise de Logs') | |
| parser.add_argument('--no-aliases', action='store_true', help='Não criar aliases') | |
| parser.add_argument('--no-batch', action='store_true', help='Não criar scripts batch') | |
| parser.add_argument('--validate-only', action='store_true', help='Apenas validar ambiente') | |
| args = parser.parse_args() | |
| setup = LogAnalysisSetup() | |
| if args.validate_only: | |
| # Apenas validação | |
| env_ok = setup.check_environment() | |
| db_info = setup.check_log_database() | |
| scripts_ok = setup.validate_scripts() | |
| if env_ok and scripts_ok: | |
| print("\n✅ Ambiente validado com sucesso!") | |
| return 0 | |
| else: | |
| print("\n❌ Problemas encontrados na validação") | |
| return 1 | |
| else: | |
| # Configuração completa | |
| success = setup.run_setup( | |
| create_aliases=not args.no_aliases, | |
| create_batch=not args.no_batch | |
| ) | |
| return 0 if success else 1 | |
| if __name__ == "__main__": | |
| exit(main()) |