CodeGym /Cours /SQL SELF /Création de la table error_log pour le logging automatiqu...

Création de la table error_log pour le logging automatique des erreurs

SQL SELF
Niveau 52, Leçon 2
Disponible

Imagine : tu bosses avec une base de données, tu traites plein de transactions, et là, bim, un truc foire. L’utilisateur râle, le business panique, et toi, tu ne vois même pas ce qui s’est passé. C’est là que le bon vieux logging d’erreurs entre en jeu. Ça permet de :

  • Garder les erreurs dans la base pour pouvoir les analyser plus tard.
  • Retrouver facilement les détails de l’erreur : quand elle est arrivée, le message et les données associées.
  • Améliorer ton code en bossant sur les erreurs typiques que tu peux repérer dans les logs.

En gros, le logging, c’est comme une caméra de surveillance pour ta base : tu vois tout ce qui a foiré, et quand ça s’est produit.

On crée la table error_log

On commence par la base. Il nous faut une table où on va stocker les infos sur les erreurs. La table aura les champs suivants :

  • id — identifiant unique de l’erreur.
  • error_message — texte de l’erreur.
  • error_time — moment où l’erreur est arrivée.
  • (Optionnel) context — contexte de l’erreur, si on veut garder des détails en plus.
CREATE TABLE error_log (
    id SERIAL PRIMARY KEY,        -- Identifiant unique de l’erreur
    error_message TEXT NOT NULL,  -- Message texte de l’erreur
    error_time TIMESTAMP NOT NULL DEFAULT NOW(), -- Moment où l’erreur est apparue
    context JSONB                 -- Infos supplémentaires sur l’erreur
);

Qu’est-ce qui se passe ici ?

  • id SERIAL PRIMARY KEY — ce champ crée automatiquement un identifiant unique pour chaque ligne.
  • error_message TEXT NOT NULL — ici, on stocke le texte de l’erreur. Ce champ est obligatoire.
  • error_time TIMESTAMP NOT NULL DEFAULT NOW() — ce champ enregistre le moment de l’événement. Si tu ne mets rien, il prend l’heure actuelle grâce à DEFAULT NOW().
  • context JSONB — optionnel, pour garder des infos en plus, genre sur l’opération où ça a planté.

Après avoir lancé la commande CREATE TABLE, ta base aura la structure pour stocker les logs.

Exemple d’enregistrement d’erreurs dans la table

Maintenant que la table est là, passons à la pratique : on va sauvegarder les infos sur les erreurs dans la table. On va écrire une fonction qui enregistre le texte de l’erreur et le moment dans error_log.

Exemple de fonction pour enregistrer les erreurs

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 — paramètre d’entrée où tu passes le texte de l’erreur.
  2. p_context — paramètre optionnel pour filer des infos en plus. Par défaut, c’est NULL.
  3. INSERT INTO error_log (error_message, context) — ajoute une nouvelle ligne dans la table error_log.
  4. DEFAULT NULL — si tu ne donnes pas de contexte, le champ sera NULL.

Maintenant, si tu veux enregistrer un message d’erreur, tu peux appeler la fonction comme ça :

SELECT log_error('Erreur lors de l’exécution de la requête', '{"query": "SELECT * FROM data"}');

Ça va ajouter une nouvelle ligne dans la table error_log.

Logging automatique des erreurs

Écrire à chaque fois SELECT log_error(...) à la main, c’est relou. On va automatiser ça avec la gestion des exceptions.

Exemple de fonction avec gestion des exceptions.

CREATE OR REPLACE FUNCTION divide_numbers(a NUMERIC, b NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
    result NUMERIC;
BEGIN
    -- On tente la division
    result := a / b;

    -- On renvoie le résultat
    RETURN result;
EXCEPTION
    WHEN division_by_zero THEN
        -- On log l’erreur et on passe le contexte
        PERFORM log_error('Division par zéro', jsonb_build_object('a', a, 'b', b));
        -- On balance une exception à l’utilisateur
        RAISE EXCEPTION 'Impossible de diviser % par % — le diviseur est zéro', a, b;
END;
$$ LANGUAGE plpgsql;
  1. Vérification de la division : on fait result := a / b. Si b = 0, PostgreSQL balance une exception division_by_zero.
  2. Gestionnaire d’exceptions (EXCEPTION) chope l’erreur.
  3. Dans le gestionnaire, on appelle la fonction log_error pour enregistrer l’erreur dans la table avec les paramètres qui ont causé le souci.
  4. Après avoir loggé l’erreur, on utilise RAISE EXCEPTION pour que l’utilisateur ait aussi le message d’erreur.

Exemple d’appel :

SELECT divide_numbers(10, 0);

Résultat :

  • L’utilisateur verra l’erreur : Impossible de diviser 10 par 0 — le diviseur est zéro.
  • Dans la table error_log, il y aura une ligne sur la division par zéro.
2
Mission
SQL SELF, niveau 52, leçon 2
Bloqué
Insertion d'un enregistrement d'erreur dans la table `error_log`
Insertion d'un enregistrement d'erreur dans la table `error_log`
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION