Protokollierung von Meldungen in Snowflake Scripting¶
Sie können Meldungen von einem in Snowflake Scripting geschriebenen Funktions- oder Prozedur-Handler protokollieren, indem Sie die Snowflake-Funktion SYSTEM$LOG, SYSTEM$LOG_<level> (für Snowflake Scripting) verwenden. Wenn Sie eine Ereignistabelle zum Speichern von Protokolleinträgen eingerichtet haben, speichert Snowflake die von Ihrem Handler-Code generierten Protokolleinträge in dieser Tabelle.
Stellen Sie vor dem Starten der Protokollierung sicher, dass der Protokolliergrad so eingestellt ist, dass die gewünschten Meldungen in der Ereignistabelle gespeichert werden. Weitere Informationen dazu finden Sie unter Einstellung der Grade für Protokollierung, Metriken und Ablaufverfolgung.
Bemerkung
Bevor Sie mit der Protokollierung von Meldungen beginnen können, müssen Sie eine Ereignistabelle einrichten. Weitere Informationen dazu finden Sie unter Überblick über die Ereignisse.
Sie können auf die Protokollmeldungen zugreifen, indem Sie einen SELECT-Befehl auf der Ereignistabelle ausführen. Weitere Informationen dazu finden Sie unter Anzeigen von Protokollmeldungen.
Allgemeine Informationen zur Einstellung der Protokollierung und zum Abrufen von Meldungen in Snowflake finden Sie unter Protokollierung von Meldungen aus Funktionen und Prozeduren.
Snowflake Scripting-Beispiel¶
Der Code im folgenden Beispiel verwendet die SYSTEM$LOG-Funktion, um Meldungen auf jeder der unterstützten Ebenen zu protokollieren. Beachten Sie, dass eine Meldung, die von Code protokolliert wird, der eine Eingabezeile verarbeitet, für jede Zeile protokolliert wird, die von dem Handler verarbeitet wird. Wenn der Handler auf einer großen Tabelle ausgeführt wird, kann dies zu einer großen Anzahl von Meldungen in der Ereignistabelle führen.
-- 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');
Automatisches Hinzufügen von Protokollmeldungen über Blöcke und untergeordnete Jobs¶
Sie können die folgenden zusätzlichen Informationen über die Ausführung einer gespeicherten Snowflake Scripting-Prozedur automatisch protokollieren:
BEGIN/END eines Snowflake Scripting-Blocks.
BEGIN/END einer untergeordneten Jobanfrage.
Die automatische Protokollierung ist für die folgenden Anwendungsfälle gedacht:
Sie möchten die zusätzlichen Protokollmeldungen erzeugen, ohne den Body der gespeicherten Prozedur zu ändern.
Sie möchten umfassende Informationen über die Ausführung der gespeicherten Prozedur.
Sie möchten mehr Einblick in die Ausführung von gespeicherten Prozeduren haben, um die Entwicklung und das Debugging zu erleichtern, ohne manuell Protokollierungscode in die Prozedur einzufügen.
Um diese Snowflake Scripting-Meldungen für eine gespeicherte Prozedur automatisch zu protokollieren, legen Sie den Parameter AUTO_EVENT_LOGGING für die gespeicherte Prozedur mit dem Befehl ALTER PROCEDURE auf LOGGING
oder ALL
fest. Wenn Sie diesen Parameter auf ALL
festlegen, werden automatisch auch zusätzliche Ablaufverfolgungsereignisse für die gespeicherte Prozedur ausgegeben.
Wichtig
Die zusätzlichen Informationen werden nur zur Ereignistabelle hinzugefügt, wenn die effektive LOG_LEVEL auf TRACE
eingestellt ist. Weitere Informationen dazu finden Sie unter Einstellung der Grade für Protokollierung, Metriken und Ablaufverfolgung.
Erstellen Sie zum Beispiel eine einfache Tabelle und fügen Sie Daten ein:
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);
Als Nächstes erstellen Sie eine gespeicherte Prozedur namens auto_event_logging_sp
. Dieses Beispiel für eine gespeicherte Prozedur aktualisiert eine Tabellenzeile und fragt dann die Tabelle ab:
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;
$$
;
Die folgenden Beispiele legen den Parameter AUTO_EVENT_LOGGING für die gespeicherte Prozedur fest:
ALTER PROCEDURE auto_event_logging_sp(VARCHAR, INTEGER, NUMBER)
SET AUTO_EVENT_LOGGING = 'LOGGING';
ALTER PROCEDURE auto_event_logging_sp(VARCHAR, INTEGER, NUMBER)
SET AUTO_EVENT_LOGGING = 'ALL';
Rufen Sie die gespeicherte Prozedur auf:
CALL auto_event_logging_sp('test_auto_event_logging', 2, 33.33);
+----+-------+
| ID | NUM |
|----+-------|
| 1 | 11.11 |
| 2 | 33.33 |
+----+-------+
Fragen Sie die Ereignistabelle nach Meldungen ab, die von der gespeicherten Prozedur namens auto_event_logging_sp
protokolliert wurden. Drucken Sie für jede Nachricht den Zeitstempel, den Protokolliergrad und den Text der Nachricht aus.
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';
+-------------------------+----------+----------------------------------+
| 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" |
+-------------------------+----------+----------------------------------+