PostgreSQL 日志详解:配置、慢查询与审计全攻略
PostgreSQL 日志中文详解:logging_collector 与 log_destination、log_line_prefix 格式定制、log_min_duration_statement 慢查询、log_statement 审计、csvlog/jsonlog 结构化输出、log_lock_waits 锁诊断,以及观测云 DataKit 采集告警落地方案。
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_explain(shared_preload_libraries 加载)能直接拿到慢查询的执行计划,优化效率倍增。
4. 审计与连接日志
log_statement = 'ddl' # none / ddl / mod / all:记录 DDL 变更
log_connections = on # 连接建立
log_disconnections = on # 连接断开(含会话时长)
log_hostname = off # 主机名反解影响性能,保持关闭
log_statement=all 会记录每一条 SQL——审计场景才用,常规生产用 ddl 或 mod(DML+DDL)。连接日志配合连接池治理:大量短连接在日志中无所遁形。
5. 错误详略与排障辅助
log_error_verbosity = default # terse / default / verbose
log_min_error_statement = error # 什么级别以上记录出错语句
verbose 模式会附带源码位置,开发期有用;生产 default 即可。
观测云落地:PostgreSQL 日志采集与分析
- 采集:DataKit
conf.d/log/logging.conf的logfiles指向 PG 日志目录,source: postgresql、service标识实例;jsonlog 自动解析为字段,stderr/csvlog 格式用 Pipeline 解析。 - 标准化:级别(ERROR/FATAL/PANIC/LOG)映射标准
status,时间字段解析为time。 - 告警:监控器对 FATAL/PANIC、连接数异常(
remaining connection slots)、锁等待日志设规则,告警策略路由钉钉/企业微信/飞书。 - 分析:日志查看器按数据库/用户/耗时聚合慢查询分布;聚类分析自动归纳高频错误模式;慢查询趋势入仪表板。
- 成本控制:慢查询日志标准索引,连接日志低频索引,审计全量日志归档对象存储。
常见问题(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 的,挂载日志目录后按文件采集。
系列阅读
- 上一篇:MySQL 日志详解
- 下一篇:MariaDB 日志详解
- 相关阅读:MongoDB 日志详解 | 降低日志成本七步法