PostgreSQL 14日志未输出SQL执行duration时长问题咨询
问题产生原因
PostgreSQL日志输出存在固定的触发逻辑,当前配置冲突导致无法打印执行时长:
- 配置项
log_statement = 'all'的触发时机是SQL开始执行前,此时SQL尚未运行完成,无法获取执行耗时,因此打印的日志只会包含SQL文本,不会携带duration字段 - 配置项
log_min_duration_statement = 400的触发时机是SQL执行完成后,本可以打印带耗时的日志,但该逻辑会被log_statement = 'all'的提前打印逻辑覆盖,不会再输出带时长的日志行 - 额外配置的
log_duration = off关闭了全局耗时打印开关,也不会单独输出SQL执行时长
配置调整方法
按如下方式修改配置即可实现预期的日志效果,输出精度为毫秒级:
- 关闭执行前打印SQL的逻辑,将
log_statement的取值从'all'修改为'none' - 保留
log_min_duration_statement = 400配置不变,该参数单位为毫秒,触发时会自动在日志中拼接duration: X.XXX ms前缀和SQL文本,和给出的预期日志格式完全匹配 - 保持
log_duration = off即可,若开启该参数会将所有SQL的耗时单独打印为一行日志,和SQL文本拆分,反而不符合预期格式
调整完成后的核心配置参考:
logging_collector = on log_min_duration_statement = 400 log_connections = on log_disconnections = on log_duration = off log_line_prefix = '%Q %r %d ' log_statement = 'none'
配置修改完成后,执行以下命令重载配置即可生效,无需重启数据库:
SELECT pg_reload_conf();
补充说明:如果需要记录所有SQL的执行耗时(无论快慢),只需将
log_min_duration_statement的值修改为0即可。
内容的提问来源于stack exchange,提问作者AlexanderKondrat
相关产品推荐
相关产品推荐

