

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 在 Python UDF 中记录错误和警告
<a name="udf-logging-messages"></a>

您可以使用 Python 日志记录模块在 UDF 中创建用户定义的错误和警告消息。执行查询后，您可以查询 [SVL\$1UDF\$1LOG](r_SVL_UDF_LOG.md) 系统视图以检索记录的消息。

**注意**  
UDF 日志记录会使用集群资源，可能会影响系统性能。我们建议仅出于开发和故障诊断目的执行日志记录。

在执行查询时，日志处理程序会向 SVL\$1UDF\$1LOG 系统视图中写入消息，以及相应的函数名称、节点和切片。日志处理程序针对每个消息、每个切片向 SVL\$1UDF\$1LOG 中写入一行。消息被截断为 4096 字节。UDF 日志被限制为每个切片 500 行。当日志已满后，日志处理程序会丢弃较旧的消息并向 SVL\$1UDF\$1LOG 中添加警告消息。

**注意**  
Amazon Redshift UDF 日志处理程序使用反斜杠 ( `\` ) 字符对换行符 ( `\n` )、竖线 ( `|` ) 字符和反斜杠 ( `\` ) 字符进行转义。

默认情况下，UDF 日志级别设置为 WARNING。日志级别为 WARNING、ERROR 和 CRITICAL 的消息会被记录下来。严重性较低 (INFO、DEBUG 和 NOTSET) 的消息会被忽略。要设置 UDF 日志级别，请使用 Python 记录器方法。例如，以下代码将日志级别设置为 INFO。

```
logger.setLevel(logging.INFO)
```

有关使用 Python 日志记录模块的更多信息，请参阅 Python 文档中的 [Python 的日志记录设施](https://docs.python.org/2.7/library/logging.html)。

以下示例创建一个名为 f\$1pyerror 的函数，用于导入 Python 日志记录模块、实例化记录器以及记录错误。

```
CREATE OR REPLACE FUNCTION f_pyerror() 
RETURNS INTEGER
VOLATILE AS
$$
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.info('Your info message here') 
return 0
$$ language plpythonu;
```

以下示例查询 SVL\$1UDF\$1LOG 以查看上一示例中记录的消息。

```
select funcname, node, slice, trim(message) as message 
from svl_udf_log;

  funcname  | query | node | slice |   message  
------------+-------+------+-------+------------------
  f_pyerror | 12345 |     1|     1 | Your info message here
```