编辑PostgreSQL主配置文件(/etc/postgresql/<version>/main/postgresql.conf
),设置以下关键参数以开启日志功能:
logging_collector = on
:启用日志收集器(必须开启,否则无法生成日志文件);log_directory = 'pg_log'
:指定日志存储目录(默认在数据目录下的pg_log
子目录,可根据需求修改为绝对路径,如/var/log/postgresql/pg_log
);log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
:定义日志文件命名模式(按日期和时间生成唯一文件名,便于归档和检索)。通过log_min_messages
参数控制日志记录的详细程度,可选值从低到高为:DEBUG5
(最详细)、DEBUG4
、DEBUG3
、DEBUG2
、DEBUG1
、INFO
(常规信息)、NOTICE
(提示信息)、WARNING
(警告)、ERROR
(错误)、LOG
(默认级别,记录常规操作)、FATAL
(致命错误)、PANIC
(系统崩溃)。生产环境建议设置为INFO
或LOG
,避免过多调试信息影响性能。
为定位性能瓶颈,需启用慢查询日志:
log_min_duration_statement = 1000
:记录执行时间超过1000毫秒(1秒)的SQL语句(可根据业务需求调整阈值,如500
表示500毫秒);log_statement = 'none'
:默认不记录所有SQL语句(避免日志过大),若需记录特定类型语句(如SELECT
、INSERT
),可设置为mod
(修改数据的SQL)或all
(所有SQL,谨慎使用)。log_connections = on
:记录客户端连接信息(如用户名、IP地址、连接时间);log_disconnections = on
:记录客户端断开连接信息(如断开原因、持续时间);log_lock_waits = on
:记录锁等待事件(帮助排查并发冲突问题)。使用tail
命令实时监控日志文件的新增内容(替换<version>
为PostgreSQL版本号,如15
):
tail -f /var/log/postgresql/postgresql-<version>-main.log
添加-n 100
参数可限制显示最后100行(如tail -f -n 100 /var/log/postgresql/postgresql-15-main.log
)。
grep
命令过滤关键字(如ERROR
、FATAL
),快速定位问题:grep -i 'error\|fatal' /var/log/postgresql/postgresql-<version>-main.log
log_min_duration_statement
,可通过以下命令提取慢查询记录:grep 'duration' /var/log/postgresql/postgresql-<version>-main.log
Debian系统默认使用logrotate
管理PostgreSQL日志轮转,配置文件位于/etc/logrotate.d/postgresql
。示例配置(每日轮转、保留7天、压缩旧日志):
/var/log/postgresql/postgresql-*.log {
daily
rotate 7
compress
missingok
notifempty
create 640 root adm
sharedscripts
}
参数说明:
daily
:每天轮转一次;rotate 7
:保留最近7个日志文件;compress
:使用gzip压缩旧日志;create 640 root adm
:轮转后创建新日志文件,权限为640,所有者为root
,所属组为adm
。若需立即轮转日志(如日志文件过大),可调用PostgreSQL提供的函数:
SELECT pg_rotate_logfile();
需通过psql
工具登录数据库执行(如sudo -u postgres psql
)。
pgBadger是PostgreSQL专用日志分析工具,可生成详细的HTML报告(涵盖查询统计、慢查询、错误信息等)。
sudo apt-get install pgbadger
pgbadger /var/log/postgresql/postgresql-*.log -o report.html
支持指定日志文件路径(/var/log/postgresql/postgresql-*.log
)和输出文件(-o report.html
)。report.html
,可直观查看查询执行次数、平均时间、锁等待情况等。对于慢查询日志中的SQL语句,可使用EXPLAIN ANALYZE
命令分析执行计划(替换为实际查询):
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 12345;
输出结果会显示查询的执行步骤(如索引扫描、排序、聚合)、实际耗时及行数,帮助识别性能瓶颈(如缺少索引、全表扫描)。
pg_log
目录权限为640
(所有者postgres
,所属组adm
),防止未授权访问敏感信息;du -sh /var/log/postgresql/pg_log
命令定期检查日志目录大小,避免占用过多磁盘空间;