如何查看 PostgreSQL 的日志?

PostgreSQL 日志位置取决于配置:启用收集器时现代版本默认目录为数据目录的 log,旧版常见 pg_log;Ubuntu 包常用 /var/log/postgresql/。本文介绍各系统的日志位置及关键配置参数。

最佳实践
如何查看 PostgreSQL 的日志?封面

启用 logging_collector 时,文件日志位置由 log_directory 决定,现代版本默认是数据目录下的 log/,旧版本常见 pg_log/。发行版或启动脚本还可能把 stderr 重定向到其他文件或 journal,应先查实际配置。

各系统的日志位置

# Ubuntu/Debian(apt 安装)
ls /var/log/postgresql/
tail -f /var/log/postgresql/postgresql-15-main.log

# 源码/自定义安装:数据目录下
tail -f "$PGDATA"/log/postgresql-*.log

# CentOS/RHEL 部分旧版本示例,先查实际 log_directory
tail -f /var/lib/pgsql/data/pg_log/postgresql-*.log

# systemd 方式
journalctl -u postgresql -n 100 -f

不确定数据目录在哪?问数据库

SHOW data_directory;
SHOW log_directory;

log_directory 是相对 data_directory 的相对路径(除非配置成绝对路径)。

确认日志收集是否开启

SHOW logging_collector;   -- 是否由 PostgreSQL 内置收集器管理日志文件

如果是 off,日志仍可能由 log_destination、启动脚本或服务管理器路由到文件、syslog 或 journal;不能仅据此判断没有日志文件。

常用日志配置

# postgresql.conf
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_min_error_statement = error
log_min_duration_statement = 1000   # 记录超过 1 秒的慢查询
log_line_prefix = '%t [%p]: user=%u,db=%d '

修改 logging_collector 需要重启;可重载的其他参数可用 SELECT pg_reload_conf(),并核对 pg_settings.pending_restart。

确定当前日志文件后,用一次可控的测试查询核对写入位置与时间。若需要在观测云集中检索,可按文件日志采集配置该路径及解析规则,再核对慢查询记录的耗时和语句;是否产生这些日志,仍由前文的 PostgreSQL 日志参数决定。

常见问题(FAQ)

Q:日志文件每天新建一个正常吗?
A:正常。log_filename 只决定文件名,触发轮转还由 log_rotation_age、log_rotation_size 等参数控制,日期占位符本身不安排每日轮转。

Q:日志里 "%t [%p]:" 这些是什么?
A:log_line_prefix 的转义序列:%t 时间、%p 进程 ID、%u 用户、%d 数据库名。

Q:Docker 里的 PostgreSQL 日志在哪?
A:容器内日志常由 stderr 经运行时收集,用 docker logs <容器> 查看;启用内置收集器时按实际 log_directory 查容器内文件。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台