CodeGym /Cursos /SQL SELF /Registro de ejecución de consultas

Registro de ejecución de consultas

SQL SELF
Nivel 45 , Lección 3
Disponible

Como en cualquier sistema complejo, en PostgreSQL pasan cosas cuando algo no va bien: las consultas tardan demasiado, la carga del servidor sube y los usuarios se ponen nerviosos. El logging es la forma de observar cómo funciona la base de datos por dentro, para:

  1. Detectar consultas lentas — esas que ralentizan la app.
  2. Optimizar el rendimiento — analizando el comportamiento de las consultas.
  3. Diagnosticar errores — como violaciones de restricciones o sintaxis incorrecta.
  4. Asegurar la auditoría — seguir quién hizo qué operaciones en el servidor.

Parámetros clave de logging

Los archivos de configuración de PostgreSQL (postgresql.conf) tienen un montón de parámetros relacionados con el logging. Vamos a ver los más importantes.

  1. log_statement — registro de consultas SQL

El parámetro log_statement define qué consultas SQL se van a guardar en el log. Puede tener estos valores:

  • none — desactiva el registro de consultas.
  • ddl — registra solo comandos de definición de datos (por ejemplo, CREATE, ALTER, DROP).
  • mod — registra todos los comandos que modifican datos (por ejemplo, INSERT, UPDATE, DELETE).
  • all — registra todas las consultas SQL (incluyendo SELECT simples).

Ejemplo:

Para activar el registro de todas las consultas, en el archivo postgresql.conf pon:

log_statement = 'all'

Si solo quieres registrar comandos que modifican datos:

log_statement = 'mod'

Después de cambiar la configuración, no olvides reiniciar el servidor:

sudo systemctl restart postgresql
  1. log_duration — registro del tiempo de ejecución

El parámetro log_duration permite guardar en el log el tiempo que tarda cada consulta. Esto es útil para ver cuáles son las más costosas en tiempo.

Ejemplo:

Para activar el registro de la duración de las consultas, pon:

log_duration = on

Si solo quieres registrar las consultas lentas, usa el parámetro log_min_duration_statement (lo vemos en un momento).

  1. log_min_duration_statement — registro de consultas lentas

Este parámetro permite guardar en el log solo las consultas que tardan más de un tiempo especificado (en milisegundos). Es súper útil para encontrar los "cuellos de botella" en la base de datos.

Ejemplo:

Para registrar consultas que tardan más de 1 segundo:

log_min_duration_statement = 1000

Si quieres registrar TODAS las consultas sin importar su duración, pon el valor 0:

log_min_duration_statement = 0

El valor -1 desactiva el registro por duración.

  1. log_line_prefix — estructura del mensaje en el log

El parámetro log_line_prefix te deja personalizar el formato de los mensajes guardados. Es útil para añadir contexto a cada consulta registrada (por ejemplo, nombre de usuario, PID, fecha y hora).

Ejemplo:

Para guardar el nombre de usuario, base de datos, hora y proceso, usa:

log_line_prefix = '%t [%p]: [%d]: [%u]: '

Aquí:

  • %t — hora de la consulta.
  • %p — PID del proceso.
  • %d — nombre de la base de datos.
  • %u — nombre de usuario.

Lista de todas las opciones disponibles: Documentación de PostgreSQL.

  1. logging_collector — recolector de logs

El parámetro logging_collector activa el mecanismo para guardar logs en archivos. Si está desactivado, los logs solo van a la salida estándar (stdout), lo cual puede ser incómodo.

Para activar el recolector de logs:

logging_collector = on

No olvides indicar la ruta del archivo de log con log_directory y log_filename:

log_directory = '/var/log/postgresql'
log_filename = 'postgresql-%Y-%m-%d.log'

Uso práctico de los parámetros

Vamos a ver cómo usar los parámetros de logging en un caso real.

Escenario 1: registro de todas las consultas

Si acabas de empezar con una base de datos nueva y quieres ver todo lo que pasa, configura:

log_statement = 'all'
log_line_prefix = '%t [%p]: [%d]: [%u]: '

Ahora cada consulta que se ejecute en la base quedará registrada en el archivo de log — ¡perfecto para debuggear!

Escenario 2: búsqueda de consultas lentas

Si notas que el servidor a veces "va lento" y quieres encontrar las consultas problemáticas, pon:

log_min_duration_statement = 500  # Registramos consultas de más de 500 ms
log_line_prefix = '%t [%p]: [%d]: [%u]: [%r] '

Donde %r añade la IP del cliente. Después de esto, podrás encontrar fácilmente las consultas que sobrecargan el servidor.

Escenario 3: modo de logging mínimo

Si tu servidor va estable pero necesitas un mínimo de logs para auditoría:

log_statement = 'mod'
log_duration = off

Aquí solo se registran los cambios de datos (por ejemplo, INSERT, UPDATE).

Análisis de logs

Cuando los logs empiezan a llenarse de datos, ¡es importante saber analizarlos! Puedes:

Abrir el archivo de logs en un editor de texto:

cat /var/log/postgresql/postgresql.log

Usar herramientas para analizar, por ejemplo, grep para buscar consultas lentas:

grep "duration: " /var/log/postgresql/postgresql.log

Utilizar utilidades para análisis avanzado de logs, como pgBadger.

Consejos útiles

Un logging demasiado detallado puede aumentar la carga en disco. En sistemas productivos usa solo los parámetros que realmente necesitas.

Limpia o archiva regularmente los archivos de logs antiguos para no llenar el disco.

El logging es efectivo con parámetros que recojan solo los datos necesarios. Por ejemplo, log_min_duration_statement ayuda a ser preciso y ahorrar recursos.

¿Y bien? Ahora ya no es problema para nosotros configurar el logging en PostgreSQL y usarlo para analizar consultas y mejorar el rendimiento. Como dijo un (bueno, no solo uno) desconocido pero claramente buen desarrollador: "Los logs son nuestra oportunidad de mirar al pasado de las consultas y arreglar el futuro de la base de datos".

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION