设置日志级别¶
您可以设置要在事件表中存储的日志消息的严重性级别。为此,请将 LOG_LEVEL 参数设置为指定级别。此级别(以及更高严重性级别)的消息将引入到事件表中。
LOG_LEVEL 既是 :ref:` 对象参数 <label-object-parameters>`,又是 :ref:` 会话参数 <label-session-parameters>`,这意味着可以在对象和会话上设置此参数。
备注
如果您的处理程序是用 Python 编写的,可以使用处理程序代码来替换用 SQL 设置的日志级别(如本主题中所述)。有关更多信息,请参阅 使用 Python 替换日志阈值级别。
了解日志级别¶
将 LOG_LEVEL 参数设置为指定级别时,仅引入指定级别的消息(以及更高严重性级别的消息)并在事件表中提供这些消息。
例如,将 LOG_LEVEL 参数设置为 WARN 表示在事件表中获取 WARN、ERROR 和 FATAL 级别的消息。
有关 LOG_LEVEL
值的列表和引入的相应级别的消息,请参阅 LOG_LEVEL。
设置对象的日志级别¶
您可以设置以下对象的日志级别:
存储过程
用户定义的函数 (UDF) 或用户定义的表函数 (UDTF)
包含过程和函数的数据库或架构
备注
您不能设置 Streamlit 对象的日志级别。但可以设置包含该对象的数据库或架构的跟踪级别。
要设置对象的日志级别,请执行以下操作:
验证您有权设置对象的日志级别。
您必须使用已授予或继承以下权限的角色:
对账户具有 MODIFY LOG LEVEL 全局权限
对要为其设置 LOG_LEVEL 的对象具有 MODIFY 权限
例如,要向
central_log_admin
角色授予权限,以在账户中设置任何数据库、架构、存储过程、UDF 或 UDTF(即使是central_log_admin
角色不具备其他权限的相应项)的日志级别,请执行以下语句:GRANT MODIFY LOG LEVEL ON ACCOUNT TO ROLE central_log_admin;
请注意,为了在存储过程或 UDF 上设置日志级别,
central_log_admin
角色还必须对包含存储过程或 UDF 的数据库/架构具有 USAGE 权限。有关 MODIFY LOG LEVEL 和 USAGE 权限的详细信息,请参阅 访问控制权限。
使用 ALTER <object> 命令设置对象上的 LOG_LEVEL 参数。
有关可使用的级别列表,请参阅 LOG_LEVEL 参数。如前所述,指定级别的消息(及严重性级别更高的消息)将引入到活跃事件表中。
例如,要设置特定 UDF 的日志级别,请使用 ALTER FUNCTION 为该 UDF 设置 LOG_LEVEL 参数。再举一个例子,若要为数据库中的所有函数和过程设置默认日志级别,请使用 ALTER DATABASE 来设置该数据库上的 LOG_LEVEL 参数。
以下示例为数据库
db
中所有函数和过程将日志级别设为 ERROR。该示例为 UDFf1(int)
将此级别替换为 WARN。USE ROLE central_log_admin; -- Set the log levels on a database and UDF. ALTER DATABASE db1 SET LOG_LEVEL = ERROR; ALTER FUNCTION f1(int) SET LOG_LEVEL = WARN;
有关 Snowflake 如何在不同对象上设置 LOG LEVEL 时确定有效日志级别的详细信息,请参阅 了解 Snowflake 如何确定有效的日志级别。
设置当前会话的日志级别¶
要设置对当前会话中函数和过程调用的日志级别,请执行以下操作:
验证您有权设置对象的日志级别。
您必须使用已获授账户的 MODIFY SESSION LOG LEVEL 全局权限 的角色。
例如,要向
developer_debugging
角色授予权限,以设置当前会话的日志级别,请执行以下语句:GRANT MODIFY SESSION LOG LEVEL ON ACCOUNT TO ROLE developer_debugging;
使用 ALTER SESSION 命令设置当前会话的 LOG_LEVEL 参数。
例如:
USE ROLE developer_debugging; -- Set the logging level to DEBUG for the current session. ALTER SESSION SET LOG_LEVEL = DEBUG;
如果针对当前会话以及该会话中调用的函数和过程将 LOG_LEVEL 参数设置成了不同级别,则 Snowflake 将确定要使用的有效日志级别。请参阅 了解 Snowflake 如何确定有效的日志级别。
了解 Snowflake 如何确定有效的日志级别¶
可以使用 :ref:` 级别层次结构 <label-parameter_hierarchy_and_types>` 替换 LOG_LEVEL 参数(对于 :ref:` 对象 <label-object-parameters>` 和 :ref:` 会话 <label-session-parameters>`)。换言之,您可以为较低级别的对象设置 LOG_LEVEL,从而替换层次结构中较高级别的 LOG_LEVEL 设置。
会话和对象 LOG_LEVEL 参数的层次结构说明如下。
对于 会话参数,层次结构为账户 » 用户 » 会话。
这意味着您可以为账户设置参数、替换用户的账户级参数,并替换当前会话的用户级参数。
对于 对象参数,层次结构为账户 » 数据库 » 架构 » 对象。
这意味着您可以为账户设置参数、替换数据库或架构的账户级参数,并替换该数据库或架构中的特定存储过程以及 UDFs 的数据库级参数或架构级参数。
例如,函数的 LOG_LEVEL 会替换包含该函数的账户的 LOG_LEVEL。如果账户的 LOG_LEVEL 是 FATAL,账户中 Java UDF 的 LOG_LEVEL 是 INFO,则生效的 LOG_LEVEL 为 INFO(函数的级别,而非账户的级别):
ALTER ACCOUNT SET LOG_LEVEL = FATAL;
ALTER FUNCTION MYJAVAUDF SET LOG_LEVEL = INFO;
-- The INFO log level is used because the FUNCTION MYJAVAUDF
-- is lower than the ACCOUNT in the hierarchy.
如果同时在会话和对象参数层次结构中设置了 LOG_LEVEL 参数,则使用最详细的 LOG_LEVEL。
下表列出的示例说明了在会话和对象上设置的参数如何影响所用日志级别。
会话的值
对象、架构、数据库或账户的值
所用日志级别
(未设置)
WARN
WARN
DEBUG
(未设置)
DEBUG
WARN
ERROR
WARN
INFO
DEBUG
DEBUG
(未设置)
(未设置)
OFF
例如,LOG_LEVEL LOG_LEVEL 会替换 DEBUG INFO。如果会话的 LOG_LEVEL 为 DEBUG,Java UDF 的 LOG_LEVEL 为 INFO,则会话的 LOG_LEVEL DEBUG 会替换 UDF 的 LOG_LEVEL INFO。(DEBUG 比 INFO 更详细)。
ALTER SESSION SET LOG_LEVEL = DEBUG;
ALTER FUNCTION MYJAVAUDF SET LOG_LEVEL = INFO;
-- The DEBUG log level is used because DEBUG is more verbose than INFO.