如何在终端输出Snowpark存储过程的日志信息?
Snowflake Python存储过程终端显示INFO级日志解决方案
问题原因
Snowflake Python存储过程运行在云端服务器环境,你配置的logging.basicConfig(stream=sys.stdout)指向的是服务器端的输出流,不会直接转发到本地终端,因此本地能生效的配置在存储过程中无法显示日志。
解决方案
根据Snowflake官方日志规范,有两种可靠方式实现终端显示INFO级日志:
方式1:使用session.log()直接输出(推荐)
利用存储过程handler函数的session参数,直接调用session.log()方法将日志发送到客户端会话:
CREATE OR REPLACE PROCEDURE do_logging() RETURNS VARCHAR LANGUAGE PYTHON PACKAGES=('snowflake-snowpark-python') RUNTIME_VERSION=3.8 HANDLER='do_things' AS $$ import logging def do_things(session): # 输出INFO级日志到终端 session.log("Logging from Python function start.", logging.INFO) try: throw_exception() except Exception as e: # 输出ERROR级日志 session.log(f"Logging an error from Python handler: {str(e)}", logging.ERROR) return "ERROR" return "SUCCESS" def throw_exception(): raise Exception("Something went wrong.") $$;
方式2:配置logging使用Snowflake内置Handler
通过添加Snowpark提供的SnowflakeLoggingHandler,让标准logging模块的输出转发到客户端:
CREATE OR REPLACE PROCEDURE do_logging() RETURNS VARCHAR LANGUAGE PYTHON PACKAGES=('snowflake-snowpark-python') RUNTIME_VERSION=3.8 HANDLER='do_things' AS $$ import logging from snowflake.snowpark._internal.utils import SnowflakeLoggingHandler # 配置logger,避免重复添加Handler logger = logging.getLogger("python_logger") logger.setLevel(logging.INFO) if not logger.handlers: logger.addHandler(SnowflakeLoggingHandler()) logger.info("Logging from Python module.") def do_things(session): logger.info("Logging from Python function start.") try: throw_exception() except Exception as e: logger.error(f"Logging an error from Python handler: {str(e)}") return "ERROR" return "SUCCESS" def throw_exception(): raise Exception("Something went wrong.") $$;
客户端配置
调用存储过程前,需在客户端会话中设置日志级别为INFO,以确保能接收并显示对应日志:
SET LOG_LEVEL = INFO;
官方规范参考(翻译自Snowflake文档)
Snowflake Python存储过程的日志系统有以下核心规则:
- 云端运行的存储过程,默认标准输出流不会直接传递到本地终端。
- 必须使用Snowpark提供的日志机制(
session.log()或SnowflakeLoggingHandler)才能将日志转发到客户端。 - 客户端会话需设置匹配的日志级别,才能显示对应级别的日志内容。
内容的提问来源于stack exchange,提问作者trey hannam
相关产品推荐
相关产品推荐

