跳转到主要内容

PostgreSQL 日志配置

为 pgBadger 配置查询日志、log_line_prefix、消息语言与运行统计

pgBadger 只能报告 PostgreSQL 实际写入日志的信息。应先确定可解析的日志前缀与清晰的语句记录策略,再按需要加入检查点、锁、临时文件和自动清理等运行事件。

最小查询日志配置

若报告需要查询文本与执行耗时,请启用按时长记录语句:

log_min_duration_statement = 0

0 会记录每一条执行完毕的语句。繁忙服务器应使用更高的毫秒阈值来控制日志量;在生产环境使用较低阈值前,应先评估开销与存储增长。

若只需要耗时与查询数量,不需要查询文本,可使用:

log_min_duration_statement = -1
log_duration = on

需要“最慢查询”和“查询总耗时”报告时,应优先使用 log_min_duration_statement。

日志前缀的必需字段

自定义 log_line_prefix 必须同时包含:

  • 一个时间字段:%t、%m 或 %n;
  • 一个进程或会话字段:%p 或 %c。

最小的 stderr 前缀如下:

log_line_prefix = '%t [%p]: '

更实用的前缀还会记录用户、数据库、应用与客户端:

log_line_prefix = '%t [%p]: user=%u,db=%d,app=%a,client=%h '

使用 syslog 作为目标时,时间与进程信息由 syslog 提供,对应前缀可写为:

log_line_prefix = 'user=%u,db=%d,app=%a,client=%h '

pgBadger 也支持另一种键顺序:

log_line_prefix = '%t [%p]: db=%d,user=%u,app=%a,client=%h '

如果前缀不属于 pgBadger 能自动识别的形式,请用 --prefix 传入与 postgresql.conf 完全一致的值,不要在命令行中自行简化或改写。

按报告需求启用相应事件:

log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
log_temp_files = 0
log_autovacuum_min_duration = 0
log_error_verbosity = default

这些设置可能产生大量日志。尤其是 log_temp_files = 0 与 log_autovacuum_min_duration = 0 会记录每一个符合条件的事件,应根据工作负载和日志保留预算调整阈值。

保持服务端消息为英文

上游解析器识别英文 PostgreSQL 服务端消息。可使用:

lc_messages = 'en_US.UTF-8'

或:

lc_messages = 'C'

上游解析器不支持 fr_FR.UTF-8 等其他消息语言。

避免互相冲突的语句设置

不要同时启用 log_min_duration_statement、log_duration 和 log_statement = 'all'。同一次执行可能被重复记录,既会放大 pgBadger 统计值,也会显著增加日志量。

目标建议设置
查询文本与耗时log_min_duration_statement = 0 或选定的阈值
仅统计耗时与次数log_min_duration_statement = -1,log_duration = on
广泛记录全部语句将 log_statement 视为独立的日志策略;用于 pgBadger 统计时不要把三项全部同时打开

重新加载 PostgreSQL 配置后,应先检查几条真实日志,再开始大规模分析。确认时间、进程/会话标识、用户、数据库、应用与客户端字段都符合选定格式。