You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在终端输出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:05:27