编辑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命令定期检查日志目录大小,避免占用过多磁盘空间;