pgbadger
Análise de logs para descoberta de consultas lentas no PostgreSQL 18.4 - transforme a saída de log_min_duration_statement em relatórios classificados que alimentam a revisão de EXPLAIN e tickets de design de índice.
Busque em todas as páginas da documentação
Análise de logs para descoberta de consultas lentas no PostgreSQL 18.4 - transforme a saída de log_min_duration_statement em relatórios classificados que alimentam a revisão de EXPLAIN e tickets de design de índice.
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)"Quando usar isso:
log_statement = all completoPasso 1 - Coletar um dia de logs
sudo ls -la /var/log/postgresql/
# postgresql-18-main.csv, postgresql-18-main.csv.1, ...Passo 2 - Gerar relatório
OUT=/var/reports/pgbadger/2026-07-09
mkdir -p "$OUT"
pgbadger /var/log/postgresql/postgresql-18-main.csv* \
-o "$OUT" \
--jobs=4 \
--top=50Passo 3 - Triar a consulta principal
-- Copie a consulta normalizada do relatório para o 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;O que isso demonstra:
app=%a quando log_line_prefix inclui %a| Configuração | Recomendado | Evitar |
|---|---|---|
log_min_duration_statement | 200-500ms em produção | 0 (registra tudo) |
log_duration | desativado ao usar min_duration | ruído duplicado |
log_lock_waits | ativado | falta de histórias de bloqueio |
log_checkpoints | ativado para triagem de IO | - |
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 sem conversão. Correção: use csvlog ou verifique se a versão do pgbadger suporta seu formato.log_min_duration_statement baseado em limite.log_parameter_max_length=0 ou redigir relatórios.%t vs UTC. Correção: alinhe log_timezone com as ferramentas de incidentes.pg_stat_statements.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
pg_stat_statements | Agregados de carga de trabalho ao vivo | Precisa de um ponto no tempo antes da redefinição |
| pganalyze | Orçamento para histórico de plano SaaS | Isolado ou sensível a custos |
auto_explain | Amostra planos automaticamente | Volume total de logs da carga de trabalho |
Cron diário incremental para produção; reunião de revisão semanal percorre as 10 principais consultas. Após cada lançamento, execute um relatório ad hoc para uma janela de 24 horas.
Sim, se você exportar logs do CloudWatch ou de arquivos para S3 e baixar o CSV. Muitas equipes usam pg_stat_statements no RDS mais EXPLAIN manual em vez disso.
Comece com 500ms para OLTP, 2s para réplica analítica. Diminua quando o armazenamento for barato e o volume de consultas for moderado. Aumente durante incidentes se o IO de log estiver sobrecarregado.
Versões da Pilha: Esta página foi escrita para PostgreSQL 18.4 e pgBadger 12.4+.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026