公司动态

慢日志一直存在?

📅 2026/7/31 22:24:25
慢日志一直存在?
PostgreSQL 的慢查询日志默认会一直累积存在不会自动删除。如果你发现日志文件越来越多、磁盘空间不断增长那是因为 PostgreSQL 本身没有内置的日志自动清理机制需要额外配置。核心问题日志文件会一直增长PostgreSQL 的日志轮转参数log_rotation_age、log_rotation_size只负责创建新文件不负责删除旧文件。解决方案方案一循环覆盖固定保留周期利用log_truncate_on_rotation on 特定的log_filename格式让同名文件被覆盖ini# 保留最近 7 天每天一个文件周一覆盖上周一 log_filename postgresql-%a.log # %a 星期几缩写 (Mon, Tue...) log_truncate_on_rotation on log_rotation_age 1d log_rotation_size 0 # 禁用按大小轮转表格保留周期log_filenamelog_rotation_age24 小时每小时覆盖postgresql-%H.log1h7 天每天覆盖postgresql-%a.log1d31 天按日期覆盖postgresql-%d.log1d12 个月按月覆盖postgresql-%m.log1month⚠️关键log_truncate_on_rotation on只在基于时间的轮转时生效基于大小的轮转不会截断而是追加。方案二外部定时清理推荐生产环境如果文件名包含唯一日期如postgresql-%Y-%m-%d.log文件会一直累积需要用cron find定期清理bash# 每天凌晨删除 30 天前的日志 0 2 * * * find /var/lib/pgsql/data/log -name postgresql-*.log -mtime 30 -delete或者用logrotatebash# /etc/logrotate.d/postgresql /var/lib/pgsql/data/log/postgresql-*.log { daily rotate 30 compress delaycompress missingok notifempty create 0600 postgres postgres }方案三生产级慢日志配置可直接用ini# ---------- 基础日志 ---------- logging_collector on log_destination stderr log_directory log log_filename postgresql-%Y-%m-%d.log # 按天切分 log_rotation_age 1d log_rotation_size 100MB log_truncate_on_rotation off # 保留历史不覆盖 # ---------- 慢查询 ---------- log_min_duration_statement 1000 # 记录 1秒的SQL log_line_prefix %t [%p] %u%d %h %a # ---------- 其他 ---------- log_checkpoints on log_lock_waits on log_temp_files 0配合 cron 清理 30 天前的日志即可。快速诊断你的日志现在什么情况bash# 查看日志目录大小 du -sh $PGDATA/log # 查看日志文件数量 ls -l $PGDATA/log | wc -l # 查看最老的日志文件 ls -lt $PGDATA/log | tail -5总结PostgreSQL 慢日志不会自己消失。要么配置循环覆盖固定周期内自动覆盖旧文件要么配置唯一文件名 外部定时清理。生产环境推荐后者便于事后追溯问题。