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');
自动添加有关区块和子任务的日志消息¶
您可以自动记录以下有关执行 Snowflake Scripting 存储过程的其他信息:
Snowflake Scripting 块的 BEGIN/END
子作业请求的 BEGIN/END
自动日志记录适用于以下用例:
您需要在不修改存储过程正文的情况下生成其他日志消息。
您需要有关存储过程执行的全面信息。
您希望提高存储过程执行的可见性,以便更轻松地进行开发和调试,而无需在存储过程中手动添加日志记录代码。
要自动记录存储过程的 Snowflake Scripting 消息,请使用 ALTER PROCEDURE 命令将存储过程的 AUTO_EVENT_LOGGING 参数设置为 LOGGING
或 ALL
。当您将此参数设置为 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);
接下来,创建一个名为 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;
$$
;
以下示例会为存储过程设置 AUTO_EVENT_LOGGING 参数:
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';
调用存储过程:
CALL auto_event_logging_sp('test_auto_event_logging', 2, 33.33);
+----+-------+
| 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';
+-------------------------+----------+----------------------------------+
| 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" |
+-------------------------+----------+----------------------------------+