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');
Copy

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);
Copy

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;
$$
;
Copy

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';
Copy
ALTER PROCEDURE auto_event_logging_sp(VARCHAR, INTEGER, NUMBER)
  SET AUTO_EVENT_LOGGING = 'ALL';
Copy

Rufen Sie die gespeicherte Prozedur auf:

CALL auto_event_logging_sp('test_auto_event_logging', 2, 33.33);
Copy
+----+-------+
| 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';
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"  |
+-------------------------+----------+----------------------------------+