LogPulse
Analizador visual de logs para desarrolladores y sysadmins. Carga archivos de 500MB+, filtra con FTS5, detecta anomalias, correlaciona eventos entre fuentes y deja que la IA te explique que fallo.
Que hace
- Indexado masivo — archivos de 500MB+ en segundos. Lectura chunked 4MB, batch insert 10K lineas, SQLite WAL mode con FTS5.
- Busqueda full-text — sintaxis FTS5 sobre mensajes de log. Filtros por nivel, servicio, rango de tiempo.
- Multi-formato — parsers built-in para syslog (RFC 3164/5424) y nginx (access/error). Sistema de plugins para formatos custom.
- IA integrada — analiza entradas individuales, resumi errores visibles, chatea con tus logs. Groq (gratis, 30 req/min) o Ollama local sin salir de tu maquina.
- Deteccion de anomalias — escaneo Z-score sobre buckets de tiempo. Deteccion automatica periodica + manual on-demand. Panel dedicado con resultados en tiempo real.
- Correlacion entre fuentes — algoritmo two-pointer O(n log n) que encuentra pares de eventos temporalmente proximos entre fuentes distintas. Confidence score por par.
- Exportacion — CSV y JSON. Incluye linea raw y campos extra opcionales. Dialogo con previsualizacion de entrada.
- Live tail — segui archivos en tiempo real via watchdog (inotify en Linux, ReadDirectoryChanges en Windows).
- Preferencias — dialogo 5 tabs (General, Visualizacion, IA, Anomalias, Atajos). Atajos de teclado configurables.
- Bilingue — espanol e ingles. Detecta locale del sistema, cambiable en caliente.
- Tema oscuro — disenado para sesiones largas. QPalette + QSS sobre Qt Fusion.
Stack
| Capa | Tecnologia |
|---|
| Runtime | Python 3.12+ |
| UI | PySide6 6.8+ (Qt 6), pyqtgraph 0.13+ |
| Base de datos | SQLite 3 (in-memory, WAL, FTS5) |
| Serializacion | orjson 3.10+ |
| Config | YAML (Linux: ~/.config/logpulse/, Windows: %APPDATA%/logpulse/) |
| Live tail | watchdog 6.0+ (cross-platform: inotify / ReadDirectoryChanges) |
| LLM | Groq API (llama/mixtral) + Ollama (local) |
| Empaquetado | PyInstaller (single binary: ELF Linux / .exe Windows) |
Instalacion
Linux
# Desde fuente
git clone https://github.com/usuario/logpulse.git
cd logpulse
pip install -e .
# Binario pre-compilado
./dist/logpulse
Windows
# Desde fuente
git clone https://github.com/usuario/logpulse.git
cd logpulse
pip install -e .
# Binario pre-compilado
dist\logpulse.exe
# Ejecutar (ambas plataformas)
logpulse
# o
python -m logpulse
Requisitos
- Python 3.12 o superior
- Qt 6 runtime (instalado automaticamente con PySide6)
- Para IA: Groq API key (gratis) u Ollama corriendo en
localhost:11434
Arquitectura
models/ → Dataclasses puras, sin Qt ni servicios
services/ → Logica de negocio, sin Qt. Single-threaded
parsers/ → Plugins de parseo (BaseParser ABC)
viewmodels/ → Qt-aware (QAbstractTableModel), puente services<->views
views/ → Widgets PySide6 puros, solo layout
workers/ → QThread / QRunnable, no tocan widgets
Flujo de datos: Archivo → chunked read → Parser → Indexer (SQLite FTS5) → QueryEngine → ViewModel → View
Servicios: Indexer, QueryEngine, ParserManager, LLMService, AnomalyDetector, CorrelationEngine, Exporter
Features
Parsers incluidos
| Parser | Formatos | Auto-detect |
|---|
syslog | RFC 3164, RFC 5424 | Si |
nginx | access.log, error.log | Si |
Plugins de terceros
Crea tus propios parsers en la carpeta de plugins de usuario:
- Linux:
~/.local/share/logpulse/parsers/*.py
- Windows:
%LOCALAPPDATA%/logpulse/parsers/*.py
from logpulse.services.parser_interface import BaseParser, ParserCapabilities, ParserConfig
from logpulse.models import LogEntry, LogLevel
from typing import Iterator
class MiParser(BaseParser):
id = "mi_formato"
display_name = "Mi Formato Custom"
capabilities = ParserCapabilities(file_extensions=(".custom",))
def parse_lines(self, lines: Iterator[str], config: ParserConfig) -> Iterator[LogEntry]:
for line in lines:
yield LogEntry(
source_id=config.source_id,
line_number=0,
message=line.strip(),
level=LogLevel.INFO,
# ... rellenar campos segun tu formato
)
Guia completa en docs/plugin-guide.md.
Deteccion de anomalias
Deteccion estadistica basada en Z-score sobre la tasa de logs por bucket de tiempo. Escaneo automatico periodico configurable (intervalo, ventana, sensibilidad) o manual on-demand desde el panel de anomalias. Resultados ordenados por severidad con timestamp, nivel y descripcion.
Correlacion entre fuentes
Algoritmo two-pointer con ventana deslizante que identifica pares de eventos temporalmente proximos entre distintas fuentes de log. Util para encontrar relaciones causa-efecto (ej. error en app seguido de error en nginx). Confidence score 0.0-1.0 con codificacion de color en el panel.
Exportacion
CSV via csv.DictWriter y JSON via orjson.dumps con indentado. Opciones: incluir linea raw original, incluir campos extra del parseo. Dialogo con selector de formato, ruta y contador de entradas.
Atajos de teclado
| Atajo | Accion |
|---|
Ctrl+O | Abrir archivo de log |
Ctrl+Shift+A | Analizar seleccion con IA |
Ctrl+Shift+E | Resumir errores visibles con IA |
Ctrl+Shift+X | Exportar entradas |
Ctrl+Q | Salir |
Todos los atajos son configurables desde Preferencias → Atajos.
IA (Groq / Ollama)
- Click derecho sobre una entrada → "Analizar con IA"
- Menu IA → Analizar Seleccion, Resumir Errores Visibles, Configurar IA...
- Chat — barra de entrada en el panel IA. Preguntale lo que quieras sobre los logs visibles
- Sin API key, la app detecta Ollama automaticamente y lo usa como fallback
Configuracion
Archivo YAML. Ubicacion cross-platform via platformdirs:
- Linux:
~/.config/logpulse/config.yaml
- Windows:
%APPDATA%/logpulse/config.yaml
# General
max_visible_rows: 1000
chunk_size_bytes: 4194304 # 4 MB
batch_insert_size: 10000
font_size: 11
theme: dark
# LLM
llm_provider: groq # groq | ollama
llm_api_key: "" # gsk_...
llm_model: llama-3.3-70b-versatile
llm_ollama_url: http://localhost:11434
llm_ollama_model: llama3.2
# Anomalias
anomaly_window_minutes: 60
anomaly_sensitivity: 0.5
anomaly_auto_scan: true
anomaly_scan_interval_minutes: 5
# Correlacion
correlation_window_seconds: 30
correlation_min_confidence: 0.3
# Exportacion
export_default_format: csv
export_default_path: ""
# Atajos configurables
shortcuts:
open: Ctrl+O
analyze: Ctrl+Shift+A
errors: Ctrl+Shift+E
export: Ctrl+Shift+X
quit: Ctrl+Q
Desarrollo
# Instalar + dev
pip install -e ".[dev]"
# Tests (197 pasando)
pytest tests/ -q
# Lint
ruff check src/
# Type check
mypy src/
# Empaquetar
pyinstaller build/logpulse.spec
Estructura del repo
src/logpulse/
├── app.py # Entry point
├── config.py # YAML config
├── i18n.py # ES/EN translation tables
├── theme.py # Dark theme (QPalette + QSS)
├── models/ # LogEntry, LogSource, FilterSet, AnalysisResult,
│ # AnomalyResult, CorrelationResult, ExportConfig,
│ # AppPreferences, IndexStats
├── services/ # Indexer, QueryEngine, ParserManager, LLMService,
│ # AnomalyDetector, CorrelationEngine, Exporter
├── parsers/ # syslog, nginx (+ plugin system via BaseParser ABC)
├── viewmodels/ # LogTableModel, FilterViewModel, SourceListModel
├── views/ # MainWindow, LogTableView, FilterBar, SourcePanel,
│ # AIPanel, AnomalyView, CorrelationView,
│ # ExportDialog, PreferencesDialog, HighlightDelegate
└── workers/ # IngestWorker, FilterWorker, AnalysisWorker,
# AnomalyWorker, ExportWorker
tests/
├── test_parsers/ # syslog, nginx
├── test_services/ # indexer, query_engine, llm_service, anomaly_detector,
│ # correlation_engine, exporter
├── test_viewmodels/ # filter_viewmodel
├── test_views/ # ai_panel
├── test_workers/ # analysis_worker, filter_worker
└── test_integration/ # ingest_and_query
Licencia
MIT © Matias Atuan