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.
Receita
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:
- Revisão semanal de consultas lentas sem habilitar
log_statement = allcompleto - Tendência histórica: "a implantação X regrediu o tempo de consulta p95?"
- Equipes sem orçamento para pganalyze ainda precisam de listas de consultas acionáveis
Exemplo de Trabalho
Passo 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:
- pgbadger classifica por tempo total e contagem de chamadas
- Relatórios vinculam a duração ao aplicativo
app=%aquandolog_line_prefixinclui%a - Evidências de EXPLAIN fecham o ciclo do log para a correção do plano
Mergulho Profundo
Tabela de Configurações de Log
| 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 | - |
Relatórios Incrementais
pgbadger --incremental --report-per-database \
--outdir /var/reports/pgbadger/incr \
/var/log/postgresql/postgresql-18-main.csv- O arquivo de estado incremental evita o reprocessamento de terabytes mensalmente
- Relatórios por banco de dados ajudam equipes de operações multilocatárias
Alternativa jq para Uso Único
grep "duration:" /var/log/postgresql/postgresql-18-main.csv \
| awk -F'duration: ' '{print $2}' | sort -rn | head -20- Triagem rápida via SSH antes da execução completa do pgbadger durante incidentes
Armadilhas
- Incompatibilidade do formato de log JSON - pgbadger espera CSV ou texto padrão, não apenas
jsonlogsem conversão. Correção: usecsvlogou verifique se a versão do pgbadger suporta seu formato. - Registrar todas as instruções - disco enche, IO colapsa. Correção:
log_min_duration_statementbaseado em limite. - PII no texto da consulta - logs capturam literais de vinculação em algumas configurações. Correção:
log_parameter_max_length=0ou redigir relatórios. - Confusão de fuso horário -
%tvs UTC. Correção: alinhelog_timezonecom as ferramentas de incidentes. - Ignorando o contexto de cache atingido - uma consulta lenta pode ser de cache frio. Correção: correlacione com o tempo médio vs. máximo do
pg_stat_statements.
Alternativas
| 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 |
FAQs
Com que frequência executar o pgbadger?
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.
O pgbadger funciona no RDS?
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.
Qual o limite de duração para produção?
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.
Relacionados
- Noções Básicas de Ferramentas - configuração de envio de logs
- Noções Básicas de Logging - configuração do coletor
- CSVlog e Logs JSON - escolha de formato
- Noções Básicas de EXPLAIN - revisão de plano após triagem
- pganalyze / OtterTune - alternativa SaaS
Versões da Pilha: Esta página foi escrita para PostgreSQL 18.4 e pgBadger 12.4+.