PostgreSQL 的日志文件存放在哪里?
PostgreSQL 日志默认位置因系统而异:Ubuntu 在 /var/log/postgresql/,macOS Homebrew 在 /opt/homebrew/var/log/postgres.log,也可配置在数据目录的 log 子目录。本文给出定位与配置方法。
快速定位:Ubuntu/Debian 上 PostgreSQL 日志在 /var/log/postgresql/ 目录;macOS Homebrew 安装在 /opt/homebrew/var/log/postgres.log(Intel 机型为 /usr/local/var/log/postgres.log);其他情况要看 postgresql.conf 中 log_directory 与 log_filename 的配置,或直接用 SQL 查询。
各系统常见默认位置
| 环境 | 位置 |
|---|---|
| Ubuntu/Debian(APT) | /var/log/postgresql/postgresql-15-main.log |
| CentOS/RHEL(PGDG) | 数据目录下 log/ 子目录,如 /var/lib/pgsql/15/data/log/ |
| macOS Homebrew(Apple Silicon) | /opt/homebrew/var/log/postgres.log |
| Docker 官方镜像 | 默认输出到 stdout/stderr,docker logs 查看 |
用 SQL 直接查
SHOW log_directory;
SHOW log_filename;
SHOW data_directory;
log_directory 若是相对路径,则相对于数据目录(data_directory)。也可以一句搞定:
SELECT setting FROM pg_settings WHERE name = 'log_directory';
关键配置项
logging_collector = on # 开启日志收集器(写文件的前提)
log_directory = 'log' # 相对数据目录
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_min_duration_statement = 500 # 慢查询阈值(毫秒),-1 关闭
改 logging_collector 需重启;log_min_duration_statement 可 SET 动态调整。
systemd 场景
很多发行版安装后日志直接进 journal,文件里反而没有:
journalctl -u postgresql -f
观测云对照
统一采集 PostgreSQL 日志。 DataKit 的 PostgreSQL 集成可采集数据库日志与慢查询,慢 SQL 经 Pipeline 解析出执行时长、语句等字段后,在日志查看器检索,并用监控器对慢查询与连接数异常做告警。
常见问题(FAQ)
Q:/var/log/postgresql/ 是空的?
A:可能 logging_collector = off,日志进了 journal;用 journalctl -u postgresql 看。
Q:日志文件每天都新建一个,能合并吗?
A:由 log_filename 的时间格式与 log_rotation_age 控制轮转粒度,把文件名中的时分去掉即按天复用追加。
Q:如何记录所有执行的 SQL?
A:临时把 log_min_duration_statement = 0 即记录全部语句;生产环境慎用,量很大。