Enregistrement des messages dans Snowflake Scripting

Vous pouvez enregistrer des messages à partir d’une fonction ou d’un gestionnaire de procédure écrit dans Exécution de scripts Snowflake en utilisant la fonction Snowflake SYSTEM$LOG, SYSTEM$LOG_<niveau> (pour l’Exécution de scripts Snowflake). Lorsque vous avez configuré une table d’événements pour stocker les entrées de journal, Snowflake stocke les entrées de journal générées par votre code de gestionnaire dans la table.

Avant de procéder à l’enregistrement à partir du code, assurez-vous que le niveau de journalisation est défini de manière à ce que les messages souhaités soient stockés dans la table d’événements. Pour plus d’informations, voir Définition des niveaux de journalisation, des métriques et du traçage.

Note

Avant de commencer à enregistrer des messages, vous devez configurer une table d’événements. Pour plus d’informations, voir Aperçu de la table d’événements.

Vous pouvez accéder aux messages du journal en exécutant une commande SELECT sur la table d’événements. Pour plus d’informations, voir Affichage des messages de journalisation.

Pour des informations générales sur la configuration de la journalisation et la récupération des messages dans Snowflake, voir Enregistrement de messages à partir de fonctions et de procédures.

Exemple de Snowflake Scripting

Le code de l’exemple suivant utilise la fonction SYSTEM$LOG pour enregistrer les messages à chacun des niveaux pris en charge. Notez qu’un message enregistré à partir d’un code qui traite une ligne d’entrée sera enregistré pour chaque ligne traitée par le gestionnaire. Si le gestionnaire est exécuté dans une grande table, il peut en résulter un grand nombre de messages dans la table des événements.

-- The following calls are equivalent.
-- Both log information-level messages.
SYSTEM$LOG('info', 'Information-level message');
SYSTEM$LOG_INFO('Information-level message');

-- The following calls are equivalent.
-- Both log error messages.
SYSTEM$LOG('error', 'Error message');
SYSTEM$LOG_ERROR('Error message');


-- The following calls are equivalent.
-- Both log warning messages.
SYSTEM$LOG('warning', 'Warning message');
SYSTEM$LOG_WARN('Warning message');

-- The following calls are equivalent.
-- Both log debug messages.
SYSTEM$LOG('debug', 'Debug message');
SYSTEM$LOG_DEBUG('Debug message');

-- The following calls are equivalent.
-- Both log trace messages.
SYSTEM$LOG('trace', 'Trace message');
SYSTEM$LOG_TRACE('Trace message');

-- The following calls are equivalent.
-- Both log fatal messages.
SYSTEM$LOG('fatal', 'Fatal message');
SYSTEM$LOG_FATAL('Fatal message');
Copy

Ajouter automatiquement des messages de journal sur les blocs et les tâches enfants

Vous pouvez connecter automatiquement les informations supplémentaires suivantes sur l’exécution d’une procédure stockée Snowflake Scripting :

  • BEGIN/END d’un bloc Snowflake Scripting.

  • BEGIN/END d’une requête de tâche enfant.

La journalisation automatique est destinée aux cas d’utilisation suivants :

  • Vous souhaitez générer les messages de journal supplémentaires sans modifier le corps de la procédure stockée.

  • Vous souhaitez obtenir des informations complètes sur l’exécution de la procédure stockée.

  • Vous souhaitez avoir plus de visibilité sur l’exécution de la procédure stockée afin de faciliter son développement et son débogage sans avoir à ajouter manuellement de code de connexion dans la procédure.

Pour connecter automatiquement ces messages Snowflake Scripting pour une procédure stockée, définissez le paramètre AUTO_EVENT_LOGGING de la procédure stockée sur LOGGING ou ALL à l’aide de la commande ALTER PROCEDURE. Lorsque vous définissez ce paramètre sur la valeur ALL, des événements de traçage supplémentaires sont également émis automatiquement pour la procédure stockée.

Important

Les informations supplémentaires ne sont ajoutées à la table des événements que si LOG_LEVEL est défini sur TRACE. Pour plus d’informations, voir Définition des niveaux de journalisation, des métriques et du traçage.

Par exemple, créez une table simple et insérez des données :

CREATE OR REPLACE TABLE test_auto_event_logging (id INTEGER, num NUMBER(12, 2));

INSERT INTO test_auto_event_logging (id, num) VALUES
  (1, 11.11),
  (2, 22.22);
Copy

Ensuite, créez une procédure stockée nommée auto_event_logging_sp. Cet échantillon de procédure stockée met à jour une ligne de la table, puis effectue une requête sur la table :

CREATE OR REPLACE PROCEDURE auto_event_logging_sp(
  table_name VARCHAR,
  id_val INTEGER,
  num_val NUMBER(12, 2))
RETURNS TABLE()
LANGUAGE SQL
AS
$$
BEGIN
  UPDATE IDENTIFIER(:table_name)
    SET num = :num_val
    WHERE id = :id_val;
  LET res RESULTSET := (SELECT * FROM IDENTIFIER(:table_name) ORDER BY id);
  RETURN TABLE(res);
EXCEPTION
  WHEN statement_error THEN
    res := (SELECT :sqlcode sql_code, :sqlerrm error_message, :sqlstate sql_state);
    RETURN TABLE(res);
END;
$$
;
Copy

Les exemples suivants permettent de définir le paramètre AUTO_EVENT_LOGGING pour la procédure stockée :

ALTER PROCEDURE auto_event_logging_sp(VARCHAR, INTEGER, NUMBER)
  SET AUTO_EVENT_LOGGING = 'LOGGING';
Copy
ALTER PROCEDURE auto_event_logging_sp(VARCHAR, INTEGER, NUMBER)
  SET AUTO_EVENT_LOGGING = 'ALL';
Copy

Appelez la procédure stockée :

CALL auto_event_logging_sp('test_auto_event_logging', 2, 33.33);
Copy
+----+-------+
| ID |   NUM |
|----+-------|
|  1 | 11.11 |
|  2 | 33.33 |
+----+-------+

Effectuez une requête dans la table des événements pour trouver les messages consignés par la procédure stockée nommée auto_event_logging_sp. Pour chaque message, imprimez l’horodatage, le niveau de journalisation et le texte du message.

SELECT
    TIMESTAMP as time,
    RECORD['severity_text'] as severity,
    VALUE as message
  FROM
    my_db.public.my_events
  WHERE
    RESOURCE_ATTRIBUTES['snow.executable.name'] LIKE '%AUTO_EVENT_LOGGING_SP%'
    AND RECORD_TYPE = 'LOG';
Copy
+-------------------------+----------+----------------------------------+
| TIME                    | SEVERITY | MESSAGE                          |
|-------------------------+----------+----------------------------------|
| 2024-10-25 20:42:24.134 | "TRACE"  | "Entering outer block at line 2" |
| 2024-10-25 20:42:24.135 | "TRACE"  | "Entering block at line 2"       |
| 2024-10-25 20:42:24.135 | "TRACE"  | "Starting child job"             |
| 2024-10-25 20:42:24.633 | "TRACE"  | "Ending child job"               |
| 2024-10-25 20:42:24.633 | "TRACE"  | "Starting child job"             |
| 2024-10-25 20:42:24.721 | "TRACE"  | "Ending child job"               |
| 2024-10-25 20:42:24.721 | "TRACE"  | "Exiting with return at line 7"  |
+-------------------------+----------+----------------------------------+