【问题标题】:Check current logging level in plpgsql检查 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 子句的相关性。你能详细说明一下吗?

标签: postgresql plpgsql


【解决方案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)。我应该澄清该函数被多次调用,所以这很明显。我想我只需要注释掉“昂贵”的调用并根据需要取消注释。
猜你喜欢
  • 1970-01-01
  • 2013-08-06
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多