CodeGym /Cursos /SQL SELF /Creando la tabla error_log para loguear errores automátic...

Creando la tabla error_log para loguear errores automáticamente

SQL SELF
Nivel 52 , Lección 2
Disponible

Imagina que estás currando con una base de datos, manejando un montón de transacciones, pero algo sale mal. El usuario se queja, el negocio grita, y tú ni siquiera ves qué ha pasado exactamente. Aquí es donde entra el logueo de errores bien hecho. Te permite:

  • Guardar los errores en la base de datos para analizarlos después.
  • Recuperar fácilmente los detalles del error: cuándo pasó, el mensaje y los datos relacionados.
  • Mejorar tu código, trabajando sobre los errores típicos que puedes pillar revisando los logs.

En resumen, el logueo es como tener una cámara de vigilancia para tu base de datos: ves todo lo que salió mal y cuándo pasó.

Creando la tabla error_log

Vamos a empezar, como se suele decir, por la base. Necesitamos crear una tabla donde vamos a guardar la info de los errores. La tabla tendrá estos campos:

  • id — identificador único del error.
  • error_message — texto del error.
  • error_time — cuándo ocurrió el error.
  • (Opcional) context — contexto del error, si queremos guardar más detalles.
CREATE TABLE error_log (
    id SERIAL PRIMARY KEY,        -- Identificador único del error
    error_message TEXT NOT NULL,  -- Mensaje de texto del error
    error_time TIMESTAMP NOT NULL DEFAULT NOW(), -- Momento en que ocurrió el error
    context JSONB                 -- Datos adicionales sobre el error
);

¿Qué está pasando aquí?

  • id SERIAL PRIMARY KEY — este campo crea un identificador único para cada registro automáticamente.
  • error_message TEXT NOT NULL — aquí se guarda el texto del error. Es obligatorio rellenarlo.
  • error_time TIMESTAMP NOT NULL DEFAULT NOW() — campo que guarda cuándo pasó el evento. Si no pones nada, mete la hora actual gracias a DEFAULT NOW().
  • context JSONB — opcional, para guardar info extra, por ejemplo, datos sobre la operación donde falló.

Después de ejecutar el comando CREATE TABLE tendrás la estructura lista para guardar logs en tu base de datos.

Ejemplo de guardar errores en la tabla

Ahora que la tabla está creada, vamos a la parte práctica: guardar info de errores en la tabla. Vamos a escribir una función que mete el texto del error y la hora en error_log.

Ejemplo de función para guardar errores

CREATE OR REPLACE FUNCTION log_error(p_error_message TEXT, p_context JSONB DEFAULT NULL)
RETURNS VOID AS $$
BEGIN
    INSERT INTO error_log (error_message, context)
    VALUES (p_error_message, p_context);
END;
$$ LANGUAGE plpgsql;
  1. p_error_message — parámetro de entrada donde metes el texto del error.
  2. p_context — parámetro opcional para pasar datos extra. Por defecto es NULL.
  3. INSERT INTO error_log (error_message, context) — mete un nuevo registro en la tabla error_log.
  4. DEFAULT NULL — si no pones contexto, el campo se queda en NULL.

Ahora, si quieres guardar un mensaje de error, puedes llamar la función así:

SELECT log_error('Error al ejecutar la consulta', '{"query": "SELECT * FROM data"}');

Esto añadirá un nuevo registro en la tabla error_log.

Logueo automático de errores

Escribir SELECT log_error(...) a mano cada vez puede ser un rollo. Vamos a automatizarlo usando manejo de excepciones.

Ejemplo de función con manejo de excepciones.

CREATE OR REPLACE FUNCTION divide_numbers(a NUMERIC, b NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
    result NUMERIC;
BEGIN
    -- Vamos a intentar dividir
    result := a / b;

    -- Devolvemos el resultado
    RETURN result;
EXCEPTION
    WHEN division_by_zero THEN
        -- Logueamos el error y pasamos el contexto
        PERFORM log_error('División por cero', jsonb_build_object('a', a, 'b', b));
        -- Lanzamos una excepción para el usuario
        RAISE EXCEPTION 'No se puede dividir % entre % — el divisor es cero', a, b;
END;
$$ LANGUAGE plpgsql;
  1. Comprobación de la división: se ejecuta result := a / b. Si b = 0, PostgreSQL lanza la excepción division_by_zero.
  2. Manejador de excepciones (EXCEPTION) pilla el error.
  3. Dentro del manejador llamamos a la función log_error para guardar el error en la tabla junto con los parámetros que causaron el problema.
  4. Después de guardar el error, con RAISE EXCEPTION lanzamos un nuevo mensaje de error para que el usuario también se entere.

Ejemplo de llamada:

SELECT divide_numbers(10, 0);

Resultado:

  • El usuario verá el error: No se puede dividir 10 entre 0 — el divisor es cero.
  • En la tabla error_log aparecerá un registro sobre la división por cero.
2
Tarea
SQL SELF, nivel 52, lección 2
Bloqueada
Inserción de un registro con error en la tabla `error_log`
Inserción de un registro con error en la tabla `error_log`
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION