Snowflake Scripting 中的日志记录消息

You can log messages from a stored procedure handler written in Snowflake Scripting by using the Snowflake SYSTEM$LOG、SYSTEM$LOG_<level> (适用于 Snowflake Scripting) function. When you've set up an event table to store log entries, Snowflake stores log entries generated by your handler code in the table.

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

备注

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

您可以通过对事件表执行 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"  |
+-------------------------+----------+----------------------------------+
语言: 中文