Conceptos básicos de registro
Los registros de PostgreSQL son su caja negra: conexiones, errores, consultas lentas y puntos de control. Configure log_line_prefix, log_min_duration_statement selectivo y disciplina de rotación antes de que el volumen de registro abrume el disco o el presupuesto de SIEM. Los valores predeterminados de PostgreSQL 18.4 son mínimos; la producción requiere una política explícita.
Receta
# Inicio de producción de postgresql.conf
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 # Umbral de consulta lenta de 1s (ms)Cuándo usar esto:
- Aprovisionamiento de clúster nuevo antes del tráfico
- Análisis forense de incidentes cuando no puede rastrear quién ejecutó DDL
- Ajuste del volumen de registro después de una alerta de disco o costo
Ejemplo de trabajo
Prefijo estructurado, captura de DDL y registro de consultas lentas sin 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 la configuración
SELECT name, setting, unit
FROM pg_settings
WHERE name LIKE 'log%'
ORDER BY name;# Campos de muestra de línea csvlog (buscar errores)
grep "ERROR" /var/lib/postgresql/18/main/log/postgresql-*.log | tail -5Lo que esto demuestra:
csvlogfacilita el análisis de SIEM frente a stderr no estructurado- El prefijo transporta el usuario, la base de datos, la aplicación, la IP del cliente y el ID de sesión para la correlación
- DDL siempre registrado; DML solo cuando es más lento que 500 ms
log_lock_waitsexpone el contexto del bloqueo en los registros
Inmersión profunda
Tokens de log_line_prefix
| Token | Significado |
|---|---|
%m | Marca de tiempo con ms |
%p | PID |
%u | Usuario |
%d | Base de datos |
%a | application_name |
%h | Host remoto |
%i | ID de sesión |
Establezca application_name en la DSN de la aplicación para la atribución del servicio.
Escalera de control de volumen
log_statement = none(DML predeterminado desactivado)log_min_duration_statementsolo para consultas lentaslog_statement = ddlpara cambios de esquemalog_statement = modsolo en ventanas de depuración cortas- Nunca
log_statement = allen producción sin un plan de muestreo
Rotación
# logging_collector gestiona la rotación cuando se alcanzan el tamaño/la edad
# Enviar fuera del host diariamente; mantener 7-30 días localmente según la políticaTrampas
- log_statement=all en OLTP - llena el disco en horas. Solución: umbral de duración + pg_stat_statements para clasificación.
- application_name faltante - cada línea muestra
app=vacío. Solución: establecer en la consulta de inicio del pool y la DSN del ORM. - Registros solo en el disco principal - el mismo volumen que PGDATA corre el riesgo de llenar el disco. Solución: enviar a un almacén central; volumen separado si se requiere retención local.
- Registro de contraseñas en errores - las consultas fallidas pueden repetir literales. Solución: consultas parametrizadas; redactar en el pipeline de registro.
- Sin zona horaria en las marcas de tiempo - dolor de cabeza de correlación. Solución:
log_timezone = 'UTC'en todas partes. - Recargar vs reiniciar - la mayoría de los GUC de registro se recargan; el cambio de
log_destinationpuede requerir un reinicio. Solución: cambiar en la ventana de mantenimiento.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| stderr + journald | VM simple, systemd | Análisis de campos CSV a escala |
| jsonlog (PG15+) | Pipelines nativos de JSON | csvlog ya estandarizado en la organización |
| Solo APM externo | Desarrollo mínimo | Las necesidades de cumplimiento requieren un registro de auditoría del servidor |
| pgaudit | Acceso regulado a tablas | Captura general de consultas lentas |
Preguntas frecuentes
¿csvlog vs stderr?
csvlog proporciona campos CSV entre comillas para los analizadores. stderr está bien para el desarrollo en un solo nodo.
¿Umbral ideal de consulta lenta?
500-1000 ms para APIs OLTP; más bajo temporalmente durante sprints de ajuste.
¿Registrar sentencias de replicación?
Generalmente no a nivel de sentencia. Utilice métricas de monitoreo de replicación en su lugar.
¿Postgres administrado acceso a registros?
RDS CloudWatch, registro de Cloud SQL, configuración de diagnóstico de Azure: aún ajuste los parámetros.
¿Incluir ID de consulta en los registros?
PostgreSQL 13+ puede usar %q en el prefijo para el ID de consulta cuando track_activity_query_size lo permite.
¿Quién puede leer los registros?
Usuario postgres del sistema operativo localmente; acceso RBAC de SIEM en el almacén central. No todos los ingenieros.
¿log_duration vs min_duration_statement?
min_duration registra la sentencia completa cuando se supera el umbral. Prefiera min_duration para análisis forense.
¿Ruido de registro de Autovacuum?
log_autovacuum_min_duration = 0 durante incidentes de hinchazón; aumentar a 1s cuando sea estable.
¿PII en los registros?
Limpiar en el pipeline de ingesta; evitar registrar cargas útiles de fila completas de los desencadenadores.
¿Disco lleno por registros?
Emergencia: aumentar la frecuencia de rotación, enviar y truncar, nunca eliminar WAL. Ver el manual de disco lleno.
Relacionado
- csvlog y registros JSON - envío centralizado
- pgaudit y registro de cumplimiento - alcance de auditoría
- Consultas forenses - investigar el acceso
- pg_stat_statements - clasificación de carga de trabajo
- Mejores prácticas de registro - lista de verificación de volumen
Versiones de pila: Esta página se escribió para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x y PostGIS 3.5+.