检查 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 中的当前日志记录级别的主要内容,如果未能解决你的问题,请参考以下文章

spring-logback

在 MISRA C 中设置日志级别的标准方法

使用 rsyslog 的 Python 日志记录级别

提升日志记录集输出级别

C++日志记录类以及日志记录程序

Winston:了解日志记录级别