如何查看 PostgreSQL 的日志?
PostgreSQL 日志位置取决于配置:默认在数据目录的 pg_log 子目录,Ubuntu 包安装在 /var/log/postgresql/。本文介绍各系统的日志位置及关键配置参数。
日志位置由 postgresql.conf 的 log_directory 决定(默认是数据目录下的 pg_log/)。Ubuntu/Debian 包安装的在 /var/log/postgresql/;systemd 系统也可以用 journalctl -u postgresql 查看。
各系统的日志位置
# Ubuntu/Debian(apt 安装)
ls /var/log/postgresql/
tail -f /var/log/postgresql/postgresql-15-main.log
# 源码/自定义安装:数据目录下
tail -f $PGDATA/pg_log/postgresql-*.log
# CentOS/RHEL
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; -- on 才会写日志文件
如果是 off,PostgreSQL 只把日志输出到 stderr(被 systemd/journald 捕获),不会有日志文件。
常用日志配置
# 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 '
改完 SELECT pg_reload_conf(); 热加载。
观测云对照
观测云提供 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:容器内日志通常输出到 stdout,用 docker logs <容器> 查看;或进容器看 $PGDATA/pg_log/。