csvlog & JSON Logs
Logs estruturados do PostgreSQL (csvlog ou jsonlog) alimentam SIEM centralizado, Loki ou CloudWatch Logs Insights. Analise uma vez, consulte por user_name, application_name e session_id, e retenha fora do host para que uma VM de banco de dados comprometida não apague evidências de auditoria.
Receita
# postgresql.conf
log_destination = 'csvlog'
logging_collector = on
log_line_prefix = '%m [%p] %u@%d %a %h '# trecho do filebeat.yml (envia csvlog)
filebeat.inputs:
- type: log
paths:
- /var/lib/postgresql/18/main/log/postgresql-*.log
fields:
service: postgresql
env: prod
output.elasticsearch:
hosts: ["https://es.internal:9200"]Quando usar isso:
- Retenção de logs centralizada SOC2/HIPAA
- Correlação entre serviços com logs de aplicativos e IdP
- Substituindo grep em discos de produção para busca de incidentes
Exemplo de Trabalho
csvlog para Elasticsearch com alternativa JSON no PostgreSQL 15+.
# Opção A: csvlog (amplamente utilizado)
log_destination = 'csvlog'
logging_collector = on
log_filename = 'postgresql-%Y-%m-%d.log'# Opção B: jsonlog (PG15+)
log_destination = 'jsonlog'
logging_collector = on# Vector.dev remap csv para JSON (conceitual)
transforms:
parse_pg:
type: remap
inputs: [postgresql_logs]
source: |
. = parse_csv!(string!(.message))
.service = "postgresql"-- Força uma linha de log de teste
\set appname test_shipper
SET application_name TO :'appname';
SELECT pg_sleep(0.1);O que isso demonstra:
- csvlog produz colunas consistentes para parsers
- jsonlog nativo um-objeto-json-por-linha em versões suportadas
application_nameaparece nas consultas do shipper para validação de canário
Mergulho Profundo
Colunas Chave do csvlog
| Coluna | Uso em SIEM |
|---|---|
log_time | Linha do tempo |
user_name | Quem |
database_name | Escopo |
application_name | Serviço |
client_addr | IP de Origem |
message | Erro ou instrução |
statement | SQL completo quando logado |
Envio Gerenciado na Nuvem
| Provedor | Mecanismo |
|---|---|
| RDS | Publicar para CloudWatch Logs, exportar para S3/OpenSearch |
| Cloud SQL | Sincronizador do Cloud Logging |
| Azure | Configurações de diagnóstico para Log Analytics |
Níveis de Retenção
- Quente (7-30d): busca ativa de incidentes
- Morna (90-365d): conformidade
- Fria/arquivo morto: armazenamento de objetos com Object Lock
Armadilhas
- Envio sem rotação - o disco local ainda enche se o coletor travar. Correção: monitore o atraso do shipper e alertas de disco livre.
- Análise de stderr como CSV - campos quebrados. Correção: um
log_destination, não ambos misturados no mesmo glob de arquivo. - Desvio de relógio - timestamps do ES discordam dos logs do aplicativo. Correção: NTP UTC no DB e coletores.
- Rastros de pilha de várias linhas - alguns erros se espalham por linhas em logs de texto; csvlog mantém uma linha por evento. Correção: prefira csvlog/jsonlog em vez de texto puro para erros.
- Registro de instruções sensíveis - SIEM se torna um repositório de PII. Correção: redija literais na ingestão; limite
log_statement. - Índices de alta cardinalidade em
message- clusters ES caros. Correção: indexe apenas os campos de usuário, db, app, código de erro.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Fluent Bit | DaemonSet leve para k8s | Transformação pesada no Vector |
| CloudWatch Logs Insights | RDS apenas AWS | ES multinuvem |
| Grafana Loki | Retenção barata baseada em rótulos | Busca de conformidade pesada em texto completo |
| syslog forward | SIEM legado | Necessidade de campos estruturados |
FAQs
csvlog ou jsonlog?
jsonlog é mais simples para pipelines JSON; csvlog é maduro na maioria dos runbooks. Escolha um por padrão da organização.
Amostrar consultas lentas?
Prefira ajuste de limite em vez de amostragem para ambientes de conformidade.
Criptografar logs em trânsito?
TLS para ES/S3; funções IAM no shipper; sem texto puro pela internet.
Estimativa de volume de logs?
DDL + 1s consultas lentas geralmente 1-10 GB/dia em OLTP intermediário; meça após 24h de piloto.
Fluxo de auditoria separado?
Sim para linhas pgaudit - retenção e classe de acesso diferentes.
Testar shipper?
Execute uma consulta canário com application_name exclusivo; pesquise no SIEM em até 60s.
Tipos de log do RDS?
Logs do postgresql, upgrade - habilite a exportação de logs do postgresql no grupo de parâmetros.
Mascaramento de PII?
Regex de cartão de crédito/email na ingestão; nunca confie em desenvolvedores para evitar registrar segredos.
Quem é o dono do parser?
Plataforma/SRE mantém o mapa de campos; DBAs definem o que é registrado.
jsonlog no PG14?
Use csvlog ou parser externo; jsonlog é PG15+.
Relacionado
- Noções Básicas de Logging - prefixo e volume
- pgaudit & Logging de Conformidade - campos de auditoria
- Consultas Forenses - investigação SIEM + SQL
- Melhores Práticas de Monitoramento - métricas complementares
- Melhores Práticas de Logging - lista de verificação de políticas
Versões da Pilha: 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+.