Snowflake Scripting 中的日志记录消息

您可以使用 Snowflake SYSTEM$LOG、SYSTEM$LOG_<level> (适用于 Snowflake Scripting) 函数,通过使用 Snowflake Scripting 编写的函数或过程处理程序记录消息。当您设置事件表来存储日志条目时,Snowflake 会将处理程序代码生成的日志条目存储在表中。

通过代码记录前,请确保您设置了日志记录级别,以便将所需的消息存储在事件表中。有关更多信息,请参阅 为日志、指标和跟踪设置级别

备注

在开始记录消息之前,必须设置事件表。有关更多信息,请参阅 事件表概述

您可以通过对事件表执行 SELECT 命令,来访问日志消息。有关更多信息,请参阅 查看日志消息

有关在 Snowflake 中设置日志记录和检索消息的一般信息,请参阅 来自函数和过程的日志记录消息

Snowflake Scripting 示例

以下示例中的代码使用 SYSTEM$LOG 函数在每个受支持级别记录消息。请注意,系统将针对处理程序处理的 每一行 记录通过处理输入行的代码记录的消息。如果在大型表中执行处理程序,则可能会导致事件表中出现大量消息。

-- 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

自动添加有关区块和子任务的日志消息

您可以自动记录以下有关执行 Snowflake Scripting 存储过程的其他信息:

  • Snowflake Scripting 块的 BEGIN/END

  • 子作业请求的 BEGIN/END

自动日志记录适用于以下用例:

  • 您需要在不修改存储过程正文的情况下生成其他日志消息。

  • 您需要有关存储过程执行的全面信息。

  • 您希望提高存储过程执行的可见性,以便更轻松地进行开发和调试,而无需在存储过程中手动添加日志记录代码。

要自动记录存储过程的 Snowflake Scripting 消息,请使用 ALTER PROCEDURE 命令将存储过程的 AUTO_EVENT_LOGGING 参数设置为 LOGGINGALL。当您将此参数设置为 ALL 时,还会自动为存储过程发出附加 跟踪事件

重要

仅当有效 LOG_LEVEL 设置为 TRACE 时,才会将附加信息添加到事件表中。有关更多信息,请参阅 为日志、指标和跟踪设置级别

例如,创建一个简单的表并插入数据:

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

接下来,创建一个名为 auto_event_logging_sp 的存储过程。此示例存储过程用于更新表行,然后对该表执行查询:

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

以下示例会为存储过程设置 AUTO_EVENT_LOGGING 参数:

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

调用存储过程:

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

在事件表中查询由名为 auto_event_logging_sp 的存储过程记录的消息。对于每条消息,打印出时间戳、日志级别和消息文本。

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"  |
+-------------------------+----------+----------------------------------+
语言: 中文