csvlog y Registros JSON
Los registros estructurados de PostgreSQL (csvlog o jsonlog) alimentan SIEM centralizado, Loki o CloudWatch Logs Insights. Analiza una vez, consulta por user_name, application_name y session_id, y retén fuera del host para que una VM de base de datos comprometida no borre la evidencia de auditoría.
Receta
# postgresql.conf
log_destination = 'csvlog'
logging_collector = on
log_line_prefix = '%m [%p] %u@%d %a %h '# fragmento de filebeat.yml (envía 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"]Cuándo usar esto:
- Retención centralizada de registros SOC2/HIPAA
- Correlación entre servicios con registros de aplicaciones e IdP
- Reemplazar
grepen discos de producción para búsqueda de incidentes
Ejemplo de Trabajo
csvlog a Elasticsearch con alternativa JSON en PostgreSQL 15+.
# Opción A: csvlog (ampliamente utilizado)
log_destination = 'csvlog'
logging_collector = on
log_filename = 'postgresql-%Y-%m-%d.log'# Opción B: jsonlog (PG15+)
log_destination = 'jsonlog'
logging_collector = on# Vector.dev remap csv a JSON (conceptual)
transforms:
parse_pg:
type: remap
inputs: [postgresql_logs]
source: |
. = parse_csv!(string!(.message))
.service = "postgresql"-- Forzar una línea de registro de prueba
\set appname test_shipper
SET application_name TO :'appname';
SELECT pg_sleep(0.1);Lo que esto demuestra:
- csvlog produce columnas consistentes para los analizadores
- jsonlog objeto JSON nativo por línea en versiones compatibles
application_nameaparece en las consultas del shipper para validación canary
Inmersión Profunda
Columnas Clave de csvlog
| Columna | Uso en SIEM |
|---|---|
log_time | Línea de tiempo |
user_name | Quién |
database_name | Ámbito |
application_name | Servicio |
client_addr | IP de origen |
message | Error o sentencia |
statement | SQL completo cuando se registra |
Envío Gestionado en la Nube
| Proveedor | Mecanismo |
|---|---|
| RDS | Publicar en CloudWatch Logs, exportar a S3/OpenSearch |
| Cloud SQL | Sink de Cloud Logging |
| Azure | Configuración de diagnóstico a Log Analytics |
Niveles de Retención
- Caliente (7-30d): búsqueda activa de incidentes
- Templado (90-365d): cumplimiento
- Frío/archivo: almacenamiento de objetos con Object Lock
Trampas
- Envío sin rotación - el disco local todavía se llena si el colector se detiene. Solución: monitorizar el retraso del shipper y las alertas de disco libre.
- Análisis de
stderrcomo CSV - campos rotos. Solución: unlog_destination, no ambos mezclados en el mismo glob de archivos. - Desfase horario - las marcas de tiempo de ES no coinciden con los registros de la aplicación. Solución: NTP UTC en la base de datos y los colectores.
- Trazas de pila multilínea - algunos errores abarcan varias líneas en registros de texto;
csvlogmantiene una fila por evento. Solución: preferircsvlog/jsonlogsobre texto plano para errores. - Registro de sentencias sensibles - SIEM se convierte en almacén de PII. Solución: redactar literales en la ingesta; limitar
log_statement. - Índices de alta cardinalidad en
message- clústeres de ES costosos. Solución: indexar solo campos de usuario, db, aplicación, código de error.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Fluent Bit | DaemonSet ligero en k8s | Transformación pesada en Vector |
| CloudWatch Logs Insights | RDS solo en AWS | ES multicloud |
| Grafana Loki | Retención barata basada en etiquetas | Cumplimiento intensivo de búsqueda de texto completo |
| Reenvío syslog | SIEM heredado | Necesidad de campos estructurados |
Preguntas Frecuentes
¿csvlog o jsonlog?
jsonlog es más simple para pipelines JSON; csvlog es maduro en la mayoría de los runbooks. Elige uno según el estándar de la organización.
¿Muestrear consultas lentas?
Prefiere ajustar umbrales sobre el muestreo para entornos de cumplimiento.
¿Cifrar registros en tránsito?
TLS a ES/S3; roles IAM en el shipper; sin texto plano a través de Internet.
¿Estimación de volumen de registros?
DDL + consultas lentas de 1s a menudo 1-10 GB/día en OLTP medio; mide después de un piloto de 24h.
¿Flujo de auditoría separado?
Sí para líneas pgaudit - retención y clase de acceso diferentes.
¿Probar el shipper?
Ejecuta una consulta canary con application_name único; busca en SIEM en 60s.
¿Tipos de registro de RDS?
Registros de postgresql, upgrade - habilita la exportación de registros de postgresql en el grupo de parámetros.
¿Depuración de PII?
Regex de tarjetas de crédito/correo electrónico en la ingesta; nunca confíes en que los desarrolladores eviten registrar secretos.
¿Quién es el propietario del analizador?
Plataforma/SRE mantiene el mapa de campos; los DBA definen qué se registra.
¿jsonlog en PG14?
Usa csvlog o un analizador externo; jsonlog es PG15+.
Relacionado
- Conceptos Básicos de Registro - prefijo y volumen
- pgaudit y Registro de Cumplimiento - campos de auditoría
- Consultas Forenses - investigación SIEM + SQL
- Mejores Prácticas de Monitorización - métricas complementarias
- Mejores Prácticas de Registro - lista de verificación de políticas
Versiones de Stack: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, y PostGIS 3.5+.