CodeGym /Cursos /SQL SELF /Logging con RAISE NOTICE

Logging con RAISE NOTICE

SQL SELF
Nivel 52 , Lección 1
Disponible

El logging es el proceso de registrar eventos importantes e información sobre cómo funciona tu aplicación o base de datos. En PL/pgSQL esto es especialmente útil cuando creas funciones complejas que llaman a otras funciones, trabajan con triggers o hacen un montón de pasos. Aquí tienes algunas razones clave de por qué el logging es necesario:

  1. Depuración de código: el logging te ayuda a entender qué está pasando exactamente en cada etapa de la ejecución de la función.
  2. Diagnóstico de problemas: si la función no funciona como esperabas, los logs te ayudan a ver dónde está el error.
  3. Análisis de ejecución: sabiendo qué pasos se ejecutaron (y en qué orden), puedes optimizar el rendimiento o encontrar puntos para mejorar.
  4. Facilidad de mantenimiento: imagina que dentro de un año abres tu función y no entiendes cómo funciona (créeme, va a pasar). Los logs te salvan en esas situaciones.

RAISE NOTICE — la base del logging

Si eres programador y alguna vez has usado print() o console.log() para depurar, entonces RAISE NOTICE es como su hermano mayor en el mundo de PostgreSQL. Es un comando que muestra mensajes informativos durante la ejecución de una función. Estos mensajes se ven en la consola, terminal o interfaz donde ejecutas tu consulta.

Sintaxis de RAISE NOTICE

RAISE NOTICE 'Mensaje de ejecución';

Pero esto es solo el principio. Puedes incluir variables en tus mensajes para hacerlos más informativos:

RAISE NOTICE 'Valor actual de la variable: %', my_variable;

Aquí % es un placeholder, y my_variable es la variable cuyo valor quieres mostrar.

Si necesitas mostrar varias variables, puedes hacerlo así:

RAISE NOTICE 'Valores: % y %', var1, var2;

Ejemplos de uso de RAISE NOTICE

1. Mostrar el valor de una variable. Vamos a declarar una variable en una función y mostrar su valor usando RAISE NOTICE.

CREATE OR REPLACE FUNCTION debug_variable_example()
RETURNS VOID AS $$
DECLARE
    my_variable INTEGER := 42;
BEGIN
    RAISE NOTICE 'Valor de la variable my_variable: %', my_variable;
END;
$$ LANGUAGE plpgsql;

Cuando llames a esta función:

SELECT debug_variable_example();

En los resultados verás algo como:

NOTICE:  Valor de la variable my_variable: 42

2. Logging de los pasos de ejecución. Imagina que tienes una función que debe hacer varios pasos. Puedes añadir RAISE NOTICE después de cada acción para asegurarte de que todo va según lo planeado.

CREATE OR REPLACE FUNCTION process_data()
RETURNS VOID AS $$
BEGIN
    RAISE NOTICE 'Paso 1: inicio del proceso';

    -- Aquí se ejecuta algún código SQL
    PERFORM pg_sleep(1); -- Simulación de operación

    RAISE NOTICE 'Paso 2: el proceso continúa';

    -- Un poco más de SQL
    PERFORM pg_sleep(1); -- Simulación de operación

    RAISE NOTICE 'Paso 3: proceso terminado';
END;
$$ LANGUAGE plpgsql;

Llamando a la función:

SELECT process_data();

Vas a obtener:

NOTICE:  Paso 1: inicio del proceso
NOTICE:  Paso 2: el proceso continúa
NOTICE:  Paso 3: proceso terminado

Ahora siempre sabes en qué etapa está la ejecución.

Aplicación práctica

Vamos a ver un ejemplo de logging de cálculos. Vamos a crear una función que calcule la suma de los números del 1 al N y haga logging del proceso:

CREATE OR REPLACE FUNCTION sum_with_logging(n INTEGER)
RETURNS INTEGER AS $$
DECLARE
    total INTEGER := 0;
    i INTEGER;
BEGIN
    RAISE NOTICE 'Inicio de los cálculos para n = %', n;

    FOR i IN 1..n LOOP
        total := total + i;
        RAISE NOTICE 'Suma en la etapa %: %', i, total;
    END LOOP;

    RAISE NOTICE 'Resultado de los cálculos: %', total;

    RETURN total;
END;
$$ LANGUAGE plpgsql;

Llamando a esta función con el parámetro 5:

SELECT sum_with_logging(5);

Vas a ver:

NOTICE:  Inicio de los cálculos para n = 5
NOTICE:  Suma en la etapa 1: 1
NOTICE:  Suma en la etapa 2: 3
NOTICE:  Suma en la etapa 3: 6
NOTICE:  Suma en la etapa 4: 10
NOTICE:  Suma en la etapa 5: 15
NOTICE:  Resultado de los cálculos: 15

Consejos útiles para logging

  1. Elimina los logs innecesarios: cuando tu función ya está lista y depurada, borra los mensajes RAISE NOTICE que sobran para no llenar la terminal o la interfaz del usuario.
  2. Usa mensajes con sentido: no pongas solo "Paso 1", "Paso 2". Deja claro qué paso se está ejecutando.
  3. Ten cuidado con la información sensible: nunca pongas en los logs datos de tarjetas de crédito, contraseñas u otra información confidencial.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION