如何查看 PostgreSQL 的日志?
PostgreSQL 日志位置取决于配置:启用收集器时现代版本默认目录为数据目录的 log,旧版常见 pg_log;Ubuntu 包常用 /var/log/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 查容器内文件。