pgbadger
Análisis de registros para el descubrimiento de consultas lentas en PostgreSQL 18.4 - convierte la salida de log_min_duration_statement en informes clasificados que alimentan la revisión de EXPLAIN y los tickets de diseño de índices.
Busca en todas las páginas de la documentación
Análisis de registros para el descubrimiento de consultas lentas en PostgreSQL 18.4 - convierte la salida de log_min_duration_statement en informes clasificados que alimentan la revisión de EXPLAIN y los tickets de diseño de índices.
ALTER SYSTEM SET log_destination = 'csvlog';
ALTER SYSTEM SET logging_collector = on;
ALTER SYSTEM SET log_min_duration_statement = '250ms';
ALTER SYSTEM SET log_statement = 'none';
ALTER SYSTEM SET log_line_prefix = '%t [%p]: user=%u,db=%d,app=%a,client=%h ';
SELECT pg_reload_conf();pgbadger /var/log/postgresql/postgresql-18-main.csv \
-o /var/reports/pgbadger/$(date +%F) \
--incremental \
--exclude-query="^(BEGIN|COMMIT|SET|SHOW)"Cuándo recurrir a esto:
log_statement = all completoPaso 1 - Recopilar un día de registros
sudo ls -la /var/log/postgresql/
# postgresql-18-main.csv, postgresql-18-main.csv.1, ...Paso 2 - Generar informe
OUT=/var/reports/pgbadger/2026-07-09
mkdir -p "$OUT"
pgbadger /var/log/postgresql/postgresql-18-main.csv* \
-o "$OUT" \
--jobs=4 \
--top=50Paso 3 - Clasificar la consulta principal
-- Copiar la consulta normalizada del informe a psql
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT o.id, o.total
FROM orders o
WHERE o.tenant_id = $1 AND o.status = 'open'
ORDER BY o.created_at DESC
LIMIT 50;Lo que esto demuestra:
app=%a cuando log_line_prefix incluye %a| Configuración | Recomendado | Evitar |
|---|---|---|
log_min_duration_statement | 200-500ms en producción | 0 (registra todo) |
log_duration | desactivado cuando se usa min_duration | ruido duplicado |
log_lock_waits | activado | falta de historias de bloqueos |
log_checkpoints | activado para triaje de E/S | - |
pgbadger --incremental --report-per-database \
--outdir /var/reports/pgbadger/incr \
/var/log/postgresql/postgresql-18-main.csvgrep "duration:" /var/log/postgresql/postgresql-18-main.csv \
| awk -F'duration: ' '{print $2}' | sort -rn | head -20jsonlog sin conversión. Solución: usar csvlog o verificar que la versión de pgbadger admita su formato.log_min_duration_statement basado en umbral.log_parameter_max_length=0 o redactar informes.%t vs UTC. Solución: alinear log_timezone con las herramientas de incidentes.pg_stat_statements.| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
pg_stat_statements | Agregados de carga de trabajo en vivo | Necesita un punto específico en el tiempo antes del reinicio |
| pganalyze | Presupuesto para historial de plan SaaS | Aislado o sensible al costo |
auto_explain | Muestrear planes automáticamente | Volumen de registro de carga de trabajo completo |
Tarea cron incremental diaria para producción; reunión de revisión semanal revisa las 10 consultas principales. Después de cada lanzamiento, ejecutar un informe ad hoc para una ventana de 24 horas.
Sí, si exporta CloudWatch o descarga registros de archivos a S3. Muchos equipos usan pg_stat_statements en RDS más EXPLAIN manual en su lugar.
Comenzar con 500ms para OLTP, 2s para réplica analítica. Bajar cuando el almacenamiento es barato y el volumen de consultas es moderado. Subir durante incidentes si la E/S de registro está sobrecargada.
Versiones de la pila: Esta página fue escrita para PostgreSQL 18.4 y pgBadger 12.4+.
Revisado por Chris St. John·Última actualización: 19 jul 2026