PostgreSQL 日志详解:配置、慢查询与审计全攻略

PostgreSQL 日志中文详解:logging_collector 与 log_destination、log_line_prefix 格式定制、log_min_duration_statement 慢查询、log_statement 审计、csvlog/jsonlog 结构化输出、log_lock_waits 锁诊断,以及观测云 DataKit 采集告警落地方案。

最佳实践
PostgreSQL 日志详解:配置、慢查询与审计全攻略技术指南封面

PostgreSQL 的日志系统以"高度可配置"著称:输出格式、内容粒度、轮转策略全部可调,15+ 版本还原生支持 JSON 结构化输出。本文系统讲解核心配置项与生产实践,并给出观测云平台的落地方案。

核心要点速览

  • logging_collector 是基础:开启后 stderr 被收集写入日志目录,配合轮转参数自动切分。
  • log_line_prefix 决定每行的信息量:时间、用户、库、进程、会话 ID 一次配齐。
  • 慢查询靠 log_min_duration_statement:记录超过阈值的语句,比全量 log_statement 实用得多。
  • jsonlog(PG15+)让日志原生结构化:观测云 DataKit 采集后自动解析为字段。

1. 日志收集与目的地

# postgresql.conf
logging_collector = on                 # 开启日志收集器
log_destination = 'jsonlog'            # stderr / csvlog / jsonlog(PG15+),可逗号组合
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_rotation_age = 1d                  # 按天轮转
log_rotation_size = 100MB              # 单文件上限
log_truncate_on_rotation = off

logging_collector 是大多数部署的必选项——不开它,日志只进 stderr,容器外基本无法管理。PG15 起的 jsonlog 直接输出 JSON 行,是平台接入的最佳格式。

2. log_line_prefix:每行日志带什么

log_line_prefix = '%m [%p] %q%u@%d %a '
# 时间戳 [进程ID] 用户@数据库 应用名

常用转义:%m(毫秒时间)、%p(PID)、%u(用户)、%d(数据库)、%a(应用名)、%s(会话 ID)、%e(SQLSTATE 错误码)、%i(命令标签)。前缀信息越完整,平台侧过滤维度越丰富。(jsonlog 模式下字段自带,无需前缀。)

3. 慢查询与性能诊断

log_min_duration_statement = 500    # 记录执行超 500ms 的语句,-1 关闭,0 记全部
log_lock_waits = on                 # 记录超 deadlock_timeout 的锁等待
log_checkpoints = on                # checkpoint 统计(写放大排查)
log_temp_files = 0                  # 记录所有临时文件生成(work_mem 调优依据)
auto_explain 扩展                    # 慢查询自动附带执行计划

log_min_duration_statement 是慢查询治理的核心:从 500ms 起步,逐步收紧。配合 auto_explainshared_preload_libraries 加载)能直接拿到慢查询的执行计划,优化效率倍增。

4. 审计与连接日志

log_statement = 'ddl'      # none / ddl / mod / all:记录 DDL 变更
log_connections = on       # 连接建立
log_disconnections = on    # 连接断开(含会话时长)
log_hostname = off         # 主机名反解影响性能,保持关闭

log_statement=all 会记录每一条 SQL——审计场景才用,常规生产用 ddlmod(DML+DDL)。连接日志配合连接池治理:大量短连接在日志中无所遁形。

5. 错误详略与排障辅助

log_error_verbosity = default   # terse / default / verbose
log_min_error_statement = error # 什么级别以上记录出错语句

verbose 模式会附带源码位置,开发期有用;生产 default 即可。

观测云落地:PostgreSQL 日志采集与分析

  1. 采集:DataKit conf.d/log/logging.conflogfiles 指向 PG 日志目录,source: postgresqlservice 标识实例;jsonlog 自动解析为字段,stderr/csvlog 格式用 Pipeline 解析。
  2. 标准化:级别(ERROR/FATAL/PANIC/LOG)映射标准 status,时间字段解析为 time
  3. 告警:监控器对 FATAL/PANIC、连接数异常(remaining connection slots)、锁等待日志设规则,告警策略路由钉钉/企业微信/飞书。
  4. 分析:日志查看器按数据库/用户/耗时聚合慢查询分布;聚类分析自动归纳高频错误模式;慢查询趋势入仪表板。
  5. 成本控制:慢查询日志标准索引,连接日志低频索引,审计全量日志归档对象存储。

常见问题(FAQ)

csvlog 和 jsonlog 选哪个?

PG15+ 直接选 jsonlog——字段自带、解析零成本。老版本用 csvlog(固定列结构,易解析)。stderr 纯文本只在前两者不可用时考虑。

log_statement=all 能开多久?

尽量短。全量 SQL 的量是业务流量的线性放大,磁盘与 I/O 都可能打满。审计需求优先考虑 pgaudit 扩展(细粒度对象级审计),而不是 all。

日志里 FATAL: remaining connection slots 是什么?

连接数打满(max_connections 上限)。短期调大参数或清理空闲连接,长期上连接池(PgBouncer)并检查应用的连接泄漏。

容器里的 PostgreSQL 日志怎么采?

容器内 PG 直接输出 stderr 时(官方镜像默认),DataKit 容器采集直接拿到;自建镜像开了 logging_collector 的,挂载日志目录后按文件采集。

系列阅读


获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台