学习PostgreSQL在Ubuntu上日志管理后,能否轻松应对所有复杂问题?
- 内容介绍
- 文章标签
- 相关推荐
Ubuntu 上 PostgreSQL 日志管理实用教程
一、日志位置 & 快速查看
在 Ubuntu 程序中,PostgreSQL 的日志默认存放在 /var/log/postgresql/或数据目录下的 pg_log/。如果你经常遇到“找不到错误原因”或“硬盘空间被日志填满”,先确认日志方法:
# 查看程序服务日志
sudo journalctl -u postgresql.service -f
# 查看传统日志文件
sudo tail -f /var/log/postgresql/postgresql-14-main.log
再看使用者痛点。多实例部署时难以快速定位是哪个实例产生的错误。
常用方法对照表
| 实例名 | 日志方法 |
|---|---|
| /var/log/postgresql/postgresql-14-main.log | |
| /var/log/postgresql/postgresql-16-main.log | |
| 自定义实例 mydb-12-service | /var/log/postgresql/mydb-12.log |
二、主要配置 & 生效方式
所有关键参数都写在 /etc/postgresql/. 当你修改后记得重新启动才能生效。
# 启用日志收集器
logging_collector = on
# 日志存储目录
log_directory = 'pg_log' # 或绝对方法 /var/log/postgresql/
# 日志文件命名格式
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
# 按时间/大小轮转
log_rotation_age = 1d # 每天轮转一次
log_rotation_size = 0 # 禁用按大小轮转
# 截断旧文件。避免重复追加
log_truncate_on_rotation = on
User Pain Point:忘记重启导致配置不生效,引发长时间的错误堆积。
检查当前配置是否生效
# 查看当前服务状态和配置文件位置
systemctl status
# 确认 PGDATA 数据目录
psql -U postgres -c 'SHOW data_directory;'
三、日志轮转与清理策略
不手动清理,磁盘会迅速被旧日志占满。推荐使用 logrotate 或 PostgreSQL 自带的 log_rotation 参数。
A. 使用 logrotate
# /etc/logrotate.d/postgresql
/var/log/postgresql/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 postgres postgres
}
B. 使用 PostgreSQL 内置机制
# 在 postgresql.conf 中设置:
logrotationage = 1d # 每天生成新文件
logrotationsize = 10485760 # 每10MB生成新文件
User Pain Point:"我只有一块小 SSD,日复一日的日志让磁盘快满了".
四、使用 pgBadger 做可视化分析
wanted quick insights?pgBadger 可以把原始文本转换成 HTML 报告。按理说,
# 安装工具
sudo apt-get install pgbadger
sudo pgbadger /var/log/postgresql/*.log -o /var/www/html/pg_report.html
User Pain Point:"我每天都在手工 grep 错误。却花太多时间".
Cron 自动化每日分析示例
# crontab -e
0 0 * * * pgbadger /var/log/postgresql/*.log -o /var/www/html/pgreport$.html>/dev/null 2>&1
五、多版本 & 多实例统一管理
Kubernetes 或 Docker Compose 部署时你可能会跑多个 PostgreSQL 实例。怎么说呢,下面给出统一命名规则和监控建议:
-
*Service 名称*: postgresql@
- .service 如:。. -
*数据目录*: /var/lib/postgresql/
- /main. -
*Log 文件*: /var/log/postgresql/
.log. - *监控脚本*: bash #!/bin/bash for svc in $;do echo "=== $svc ===" systemctl status $svc | grep Active done 这段脚本可以一次性输出所有实例状态。User Pain Point:"每次检查都要打开多个终端,一次性看不到整体健康状态".
六、常见问题 & 一键排查方案
| 问题现象 | 可能原因 | 方法 | ||||
|---|---|---|---|---|---|---|
| 数据库连接超时 / 无法开启服务 | ||||||
| ① Postgres 无法启动;② 查询报错 “connection refused”;③ “database is not reachable” 等。 | ① logging_collector 未开启导致无错误信息;② log_directory 指向不存在目录;③ 配置变更后未重新启动。 | ① 在 postgresql.conf 中把 logging_collector 设置为 on 并重启;② 确认 log_directory 方法存在且权限正确;③ 重启后再查看 journalctl 输出。 其实,bash sudo systemctl restart sudo journalctl -u --since "10 minutes ago" 请务必检查 PGDATA 权限是否被误改。bash ls -ld /var/lib/postgresql/14/main chown -R postgres:postgres /var/lib/postgresql/14/main 从使用者痛点来看。"我每次重启后仍然报错,却不知道是权限还是方法问题". --- | ||||
| ② 磁盘已满但仍能写入,但查询慢或报错 “disk is full”。 | ① 未设置 log_rotate_age 或 size;② 程序未自动删除旧日志;③ 数据库本身已占用大量空间。 | ① 在 config 中开启 log_rotate_age 并设置合适保留周期;② 配置 logrotate 或 cron 清理旧文件;③ 定期执行 VACUUM FULL 或者删除不必要的 WAL 文件。bash
psql -U postgres | ③ 高并发查询出现 “too many connections” 或频繁报错“timeout”。 |
① max_connections 设置过低或没有针对不同实例做区分;② 各实例共享同一数据库 cluster 时竞争资源。 |
① 根据机器 CPU/RAM 调整 max_connections,例如每 GB RAM 给一个连接数上限;老实说,② 对于多实例环境。可以为每个实例单独指定 max_connections 并通过 PgBouncer 做连接池。conf
max_connections = 100 # 单个实例值示例
shared_buffers = 256MB
---
| ④ 日志内容太冗长,特别是 debug 模式导致大量无用信息。话说回来,① logging_level 设置为 DEBUG;② log_statement 被设为 ALL 导致每条 SQL 都记录。① 将 logging_collector 保持 ON,但将 logging_level 改为 WARNING 并把 log_statement 改为 NONE 或 MODERATE。conf
logging_collector = on
logging_level = warning
log_statement = none
---
| |
七、与常用方法建议
- 始终开启 logging_collector 并使用绝对方法确保可写。
Ubuntu 上 PostgreSQL 日志管理实用教程
一、日志位置 & 快速查看
在 Ubuntu 程序中,PostgreSQL 的日志默认存放在 /var/log/postgresql/或数据目录下的 pg_log/。如果你经常遇到“找不到错误原因”或“硬盘空间被日志填满”,先确认日志方法:
# 查看程序服务日志
sudo journalctl -u postgresql.service -f
# 查看传统日志文件
sudo tail -f /var/log/postgresql/postgresql-14-main.log
再看使用者痛点。多实例部署时难以快速定位是哪个实例产生的错误。
常用方法对照表
| 实例名 | 日志方法 |
|---|---|
| /var/log/postgresql/postgresql-14-main.log | |
| /var/log/postgresql/postgresql-16-main.log | |
| 自定义实例 mydb-12-service | /var/log/postgresql/mydb-12.log |
二、主要配置 & 生效方式
所有关键参数都写在 /etc/postgresql/. 当你修改后记得重新启动才能生效。
# 启用日志收集器
logging_collector = on
# 日志存储目录
log_directory = 'pg_log' # 或绝对方法 /var/log/postgresql/
# 日志文件命名格式
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
# 按时间/大小轮转
log_rotation_age = 1d # 每天轮转一次
log_rotation_size = 0 # 禁用按大小轮转
# 截断旧文件。避免重复追加
log_truncate_on_rotation = on
User Pain Point:忘记重启导致配置不生效,引发长时间的错误堆积。
检查当前配置是否生效
# 查看当前服务状态和配置文件位置
systemctl status
# 确认 PGDATA 数据目录
psql -U postgres -c 'SHOW data_directory;'
三、日志轮转与清理策略
不手动清理,磁盘会迅速被旧日志占满。推荐使用 logrotate 或 PostgreSQL 自带的 log_rotation 参数。
A. 使用 logrotate
# /etc/logrotate.d/postgresql
/var/log/postgresql/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 postgres postgres
}
B. 使用 PostgreSQL 内置机制
# 在 postgresql.conf 中设置:
logrotationage = 1d # 每天生成新文件
logrotationsize = 10485760 # 每10MB生成新文件
User Pain Point:"我只有一块小 SSD,日复一日的日志让磁盘快满了".
四、使用 pgBadger 做可视化分析
wanted quick insights?pgBadger 可以把原始文本转换成 HTML 报告。按理说,
# 安装工具
sudo apt-get install pgbadger
sudo pgbadger /var/log/postgresql/*.log -o /var/www/html/pg_report.html
User Pain Point:"我每天都在手工 grep 错误。却花太多时间".
Cron 自动化每日分析示例
# crontab -e
0 0 * * * pgbadger /var/log/postgresql/*.log -o /var/www/html/pgreport$.html>/dev/null 2>&1
五、多版本 & 多实例统一管理
Kubernetes 或 Docker Compose 部署时你可能会跑多个 PostgreSQL 实例。怎么说呢,下面给出统一命名规则和监控建议:
-
*Service 名称*: postgresql@
- .service 如:。. -
*数据目录*: /var/lib/postgresql/
- /main. -
*Log 文件*: /var/log/postgresql/
.log. - *监控脚本*: bash #!/bin/bash for svc in $;do echo "=== $svc ===" systemctl status $svc | grep Active done 这段脚本可以一次性输出所有实例状态。User Pain Point:"每次检查都要打开多个终端,一次性看不到整体健康状态".
六、常见问题 & 一键排查方案
| 问题现象 | 可能原因 | 方法 | ||||
|---|---|---|---|---|---|---|
| 数据库连接超时 / 无法开启服务 | ||||||
| ① Postgres 无法启动;② 查询报错 “connection refused”;③ “database is not reachable” 等。 | ① logging_collector 未开启导致无错误信息;② log_directory 指向不存在目录;③ 配置变更后未重新启动。 | ① 在 postgresql.conf 中把 logging_collector 设置为 on 并重启;② 确认 log_directory 方法存在且权限正确;③ 重启后再查看 journalctl 输出。 其实,bash sudo systemctl restart sudo journalctl -u --since "10 minutes ago" 请务必检查 PGDATA 权限是否被误改。bash ls -ld /var/lib/postgresql/14/main chown -R postgres:postgres /var/lib/postgresql/14/main 从使用者痛点来看。"我每次重启后仍然报错,却不知道是权限还是方法问题". --- | ||||
| ② 磁盘已满但仍能写入,但查询慢或报错 “disk is full”。 | ① 未设置 log_rotate_age 或 size;② 程序未自动删除旧日志;③ 数据库本身已占用大量空间。 | ① 在 config 中开启 log_rotate_age 并设置合适保留周期;② 配置 logrotate 或 cron 清理旧文件;③ 定期执行 VACUUM FULL 或者删除不必要的 WAL 文件。bash
psql -U postgres | ③ 高并发查询出现 “too many connections” 或频繁报错“timeout”。 |
① max_connections 设置过低或没有针对不同实例做区分;② 各实例共享同一数据库 cluster 时竞争资源。 |
① 根据机器 CPU/RAM 调整 max_connections,例如每 GB RAM 给一个连接数上限;老实说,② 对于多实例环境。可以为每个实例单独指定 max_connections 并通过 PgBouncer 做连接池。conf
max_connections = 100 # 单个实例值示例
shared_buffers = 256MB
---
| ④ 日志内容太冗长,特别是 debug 模式导致大量无用信息。话说回来,① logging_level 设置为 DEBUG;② log_statement 被设为 ALL 导致每条 SQL 都记录。① 将 logging_collector 保持 ON,但将 logging_level 改为 WARNING 并把 log_statement 改为 NONE 或 MODERATE。conf
logging_collector = on
logging_level = warning
log_statement = none
---
| |
七、与常用方法建议
- 始终开启 logging_collector 并使用绝对方法确保可写。

