Noções Básicas de Logging
Os logs do PostgreSQL são seu gravador de voo: conexões, erros, consultas lentas e checkpoints. Configure log_line_prefix, log_min_duration_statement seletivo e disciplina de rotação antes que o volume de log sobrecarregue o disco ou o orçamento do SIEM. Os padrões do PostgreSQL 18.4 são mínimos; a produção requer uma política explícita.
Receita
# postgresql.conf starter para produção
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 100MB
log_line_prefix = '%m [%p] %u@%d %a %h %i '
log_connections = on
log_disconnections = on
log_statement = 'ddl'
log_min_duration_statement = 1000 # Limite de 1s para consulta lenta (ms)Quando usar isso:
- Provisionamento de novo cluster antes do tráfego
- Análise forense de incidentes quando você não consegue rastrear quem executou DDL
- Ajuste de volume de log após alerta de disco ou custo
Exemplo de Trabalho
Prefixo estruturado, captura de DDL e log de consultas lentas sem log_statement=all.
# postgresql.conf
log_destination = 'csvlog'
logging_collector = on
log_line_prefix = '%t [%p]: user=%u,db=%d,app=%a,client=%h,session=%i '
log_connections = on
log_disconnections = on
log_statement = 'ddl'
log_min_duration_statement = 500
log_checkpoints = on
log_autovacuum_min_duration = 0
log_lock_waits = onSELECT pg_reload_conf();
-- Verificar configurações
SELECT name, setting, unit
FROM pg_settings
WHERE name LIKE 'log%'
ORDER BY name;# Campos de exemplo de linha csvlog (filtrar erros)
grep "ERROR" /var/lib/postgresql/18/main/log/postgresql-*.log | tail -5O que isso demonstra:
csvlogfacilita o parsing do SIEM em comparação com stderr não estruturado- O prefixo carrega usuário, banco de dados, aplicativo, IP do cliente, ID da sessão para correlação
- DDL sempre registrado; DML apenas quando mais lento que 500ms
log_lock_waitsexpõe o contexto do bloqueador nos logs
Mergulho Profundo
Tokens de log_line_prefix
| Token | Significado |
|---|---|
%m | Timestamp com ms |
%p | PID |
%u | Usuário |
%d | Banco de dados |
%a | application_name |
%h | Host remoto |
%i | ID da sessão |
Defina application_name no DSN do aplicativo para atribuição de serviço.
Escada de Controle de Volume
log_statement = none(DML padrão desativado)log_min_duration_statementapenas para consultas lentaslog_statement = ddlpara alterações de esquemalog_statement = modapenas em curtas janelas de depuração- Nunca use
log_statement = allem produção sem um plano de amostragem
Rotação
# logging_collector gerencia a rotação quando o tamanho/idade são atingidos
# Enviar para fora do host diariamente; manter 7-30 dias localmente por políticaArmadilhas
- log_statement=all em OLTP - enche o disco em horas. Correção: limite de duração + pg_stat_statements para classificação.
- application_name ausente - cada linha mostra
app=vazio. Correção: definir na consulta de inicialização do pool e no DSN do ORM. - Logs apenas no disco principal - o mesmo volume do PGDATA corre o risco de disco cheio. Correção: enviar para um armazenamento central; volume separado se a retenção local for necessária.
- Registrando senhas em erros - consultas com falha podem ecoar literais. Correção: consultas parametrizadas; redigir no pipeline de log.
- Sem fuso horário nos timestamps - dor de cabeça na correlação. Correção:
log_timezone = 'UTC'em todos os lugares. - Recarregar vs reiniciar - a maioria dos GUCs de log recarrega; a alteração de
log_destinationpode precisar de reinicialização. Correção: alterar em janela de manutenção.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| stderr + journald | VM simples, systemd | Parsing de campos CSV em escala |
| jsonlog (PG15+) | Pipelines nativos JSON | csvlog já padronizado na organização |
| Apenas APM externo | Pequeno desenvolvimento | Necessidades de conformidade com trilha de auditoria do servidor |
| pgaudit | Acesso regulamentado a tabelas | Captura geral de consultas lentas |
FAQs
csvlog vs stderr?
csvlog fornece campos CSV entre aspas para parsers. stderr é bom para desenvolvimento em nó único.
Limite ideal para consulta lenta?
500-1000ms para APIs OLTP; menor temporariamente durante sprints de ajuste.
Registrar instruções de replicação?
Geralmente não em nível de instrução. Use métricas de monitoramento de replicação em vez disso.
Acesso a logs do Postgres gerenciado?
RDS CloudWatch, logging do Cloud SQL, configurações de diagnóstico do Azure - ainda ajuste os parâmetros.
Incluir ID da consulta nos logs?
PostgreSQL 13+ pode usar %q no prefixo para o ID da consulta quando track_activity_query_size permite.
Quem pode ler os logs?
Usuário postgres do SO localmente; RBAC de acesso SIEM no armazenamento central. Nem todos os engenheiros.
log_duration vs min_duration_statement?
min_duration registra a instrução completa quando o limite é excedido. Prefira min_duration para análise forense.
Ruído do log Autovacuum?
log_autovacuum_min_duration = 0 durante incidentes de bloat; aumentar para 1s quando estável.
PII em logs?
Limpar no pipeline de ingestão; evitar registrar payloads de linha completa de triggers.
Disco cheio por logs?
Emergência: aumentar a frequência de rotação, enviar e truncar, nunca excluir WAL. Veja o runbook de disco cheio.
Relacionado
- csvlog & JSON Logs - envio centralizado
- pgaudit & Logging de Conformidade - escopo de auditoria
- Consultas Forenses - investigar acesso
- pg_stat_statements - classificação de carga de trabalho
- Melhores Práticas de Logging - lista de verificação de volume
Versões de Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, e PostGIS 3.5+.