PLPython触发器函数日志无法输出至PostgreSQL日志文件求助
PLPython触发器日志无法写入PostgreSQL日志文件的排查方案
问题背景
使用PLPython编写的触发器函数中,调用plpy.error、plpy.info、plpy.notice等日志函数时,只有plpy.fatal能触发异常捕获,其余日志内容无法输出到PostgreSQL日志文件。
触发器代码示例:
CREATE FUNCTION public.myfunction() RETURNS trigger LANGUAGE plpythonu AS $$ try: plpy.error("log error") plpy.info("log info") plpy.notice("log notice") if TD["event"] != "INSERT": return "OK" # 其他业务逻辑 except Exception, ex: #plpy.info("f_b_cli_after : %s" % ex) return None $$;
当前PostgreSQL配置(postgresql.conf):
log_destination = 'stderr' logging_collector = on log_directory = '/var/log/postgresql' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' client_min_messages = notice log_min_messages = info log_min_error_statement = info log_statement = 'all'
已知plpy.notice等价于SQL的RAISE NOTICE,但日志仍无法输出,需排查原因。
解决步骤
1. 修复代码执行逻辑问题
你的代码中第一个调用的plpy.error会直接终止函数执行,后续的plpy.info和plpy.notice根本没有机会运行。plpy.error的行为是抛出PostgreSQL错误,触发try-except捕获,函数随即返回None,后面的代码全部跳过。
调整代码顺序,先测试非终止型日志函数:
try: plpy.notice("log notice") plpy.info("log info") # 先注释plpy.error,确保后续代码执行 # plpy.error("log error") if TD["event"] != "INSERT": return "OK" # 其他业务逻辑 except Exception, ex: #plpy.info("f_b_cli_after : %s" % ex) return None
2. 确认PostgreSQL配置生效
你的配置参数本身是正确的:
log_min_messages = info确保info及以上级别的日志会被写入日志文件client_min_messages = notice仅控制客户端收到的消息级别,不影响日志文件记录
注意:修改postgresql.conf后,必须重启PostgreSQL服务才能让配置完全生效,仅执行pg_reload_conf()可能无法加载所有日志相关参数。
3. 检查日志目录权限
确认PostgreSQL运行用户(通常是postgres)对/var/log/postgresql目录有读写权限:
# 查看目录权限 ls -ld /var/log/postgresql # 查看PostgreSQL进程用户 ps aux | grep postgres
如果权限不足,执行以下命令调整:
chown postgres:postgres /var/log/postgresql chmod 700 /var/log/postgresql
4. 明确PLPython日志函数的差异
不同plpy日志函数的行为有本质区别,需根据场景选择:
plpy.notice/plpy.info:仅输出日志,不会中断函数执行plpy.error:抛出错误,触发异常捕获并终止函数plpy.fatal:直接终止数据库连接,属于最严重的级别
内容的提问来源于stack exchange,提问作者k4ppa
相关产品推荐
相关产品推荐

