检查 plpgsql 中的当前日志记录级别
Posted
技术标签:
【中文标题】检查 plpgsql 中的当前日志记录级别【英文标题】:Check current logging level in plpgsql 【发布时间】:2013-08-11 14:51:43 【问题描述】:PostgreSQL 9.2 中对性能至关重要的 plpgsql 函数有一个“RAISE DEBUG”语句,它为其中一个参数调用昂贵的函数,即。
RAISE DEBUG 'Details: %', expensive_function(...);
似乎即使禁用了 DEBUG 日志记录,该函数也会被调用。有没有办法可以在 IF 语句中检查当前的日志记录级别(log_min_messages 和 client_min_messages),或者只有在需要时才能调用该函数的其他方式?
【问题讨论】:
检查exception
子句。 postgresql.org/docs/current/static/…
我从未阅读过任何文档来确认这一点,但我观察到 raise 语句将始终触发,您只能将配置设置为实际将日志写入客户端或服务器,或者不要。所以没有办法在你的加注之前放置一个 if 检查来检查你是否想记录。我就是这样处理的。不完美,但可以忍受。
我很高兴进行 IF 检查,我只是不知道条件是什么 - 这就是这个问题的意义所在。
@Clodoaldo Neto,我看不到 EXCEPTION 子句的相关性。你能详细说明一下吗?
【参考方案1】:
您可以使用SHOW
将调试级别检索到变量中,然后将其作为一段文本进行测试。
plpgsql 中的示例:
DECLARE
dbg_level text;
BEGIN
SHOW client_min_messages INTO dbg_level;
IF (dbg_level ilike 'debug%') THEN
RAISE DEBUG 'details: %', expensive_function();
END IF;
END;
【讨论】:
+1 用于教我“SHOW ... INTO”。我对此进行了测试,但不幸的是,检查它所花费的时间与我的“昂贵”功能一样多,这使得它对我的场景适得其反。 (顺便说一句,我也检查了log_min_messages
。)
@EM:这太令人惊讶了。在我的台式机(Intel i5-3470 CPU)上,上面的代码似乎花费了不到 0.002 毫秒。
@EM 你能量化一下时间价值中昂贵的含义吗?
对我来说大约需要 0.009 毫秒(同时检查 client_min_messages 和 log_min_messages)。我应该澄清该函数被多次调用,所以这很明显。我想我只需要注释掉“昂贵”的调用并根据需要取消注释。以上是关于检查 plpgsql 中的当前日志记录级别的主要内容,如果未能解决你的问题,请参考以下文章