PostgreSQL 日志文件相关的配置

PostgreSQL 日志文件相关的配置

二、PostgreSQL 日志配置选项

功能域 主要参数 说明与常用值
日志是否写文件 *logging_collector on/off;打开后 stderr/csvlog 才真正落到文件
日志写到哪里 *log_destination stderr / csvlog / syslog / eventlog(可组合)
log_directory 目录,如 ‘pg_log’(相对 PGDATA)或绝对路径
log_filename 文件命名模板,如 ‘postgresql-%Y-%m-%d_%H%M%S.log’
log_rotation_age 按时间切换日志文件,默认 1d
log_rotation_size 按大小切换日志文件,默认 10MB
log_truncate_on_rotation on/off;同名文件是否截断
log_file_mode 0600 等八进制权限
记录什么等级的信息 log_min_messages DEBUG5..PANIC,默认 WARNING
log_min_error_statement 记录导致 ERROR 及以上级别的 SQL
慢 SQL / 语句统计 log_min_duration_statement -1 关闭;0 全部;>0 只记录慢于 n ms 的
log_statement none / ddl / mod / all
log_duration on/off;每条 SQL 的耗时
连接与会话 log_connections / log_disconnections on/off;记录客户端连接/断开
锁与等待事件 log_lock_waits on/off;记录超过 deadlock_timeout 的锁等待
日志格式 log_line_prefix ‘%m [%p] %u@%d %r ’ 等模板
其他 log_checkpoints / log_temp_files / log_timezone … 按需开启

这些参数控制的是 PostgreSQL 实例级 的“数据库活动日志”(俗称 pg_log)。

log_statement参数选项

取值 含义 举例:以下语句 是否 写进日志
none 一条语句也不记 任何 SQL 都不记录
ddl 只记录 数据定义 语句(所有 CREATE / ALTER / DROP / GRANT / REVOKE …) CREATE TABLE …、ALTER INDEX …、DROP SCHEMA … 会记录;SELECT / INSERT / UPDATE / DELETE 不记录
mod ddl 基础上,再加 所有数据修改 语句(INSERT / UPDATE / DELETE / COPY FROM / TRUNCATE …) 上表中的 CREATE TABLE 会记录;INSERT INTO …、UPDATE …、DELETE FROM … 也会记录;SELECT / COPY TO 不记录
all 任何发送到服务器的 SQL(包括 SELECT、COPY TO、BEGIN、COMMIT、甚至 PREPARE)全部记录 所有语句都会记录

额外注意

log_statement与 log_min_duration_statement 互不影响:

  • log_statement = 'none' 时,只要 log_min_duration_statement = 500,超过 500 ms 的语句仍会被记录。
  • 如果两者都打开,语句不会重复出现在日志里。

二、PostgreSQL 除活动日志外的 3 种物理日志

(它们不是通过上述参数配置,而是数据库自己维护)

    1. WAL(pg_wal) – 事务重做日志;大小由 max_wal_size、min_wal_size 控制。
    1. 事务状态日志 pg_clog(≤9.6)/ pg_xact(≥10) – 记录事务提交/回滚状态,自动管理。
    1. 逻辑复制槽日志 pg_replslot/ – 只在创建逻辑槽后出现,由 max_replication_slots 限制。

可通过以下命令查看

select * from pg_settings where name like 'log_%'

配置实例

下面给出一份可直接落地的 postgresql.conf 片段,保证

  • 1.PostgreSQL 日志文件至少保留 30 天(≈1 个月);
  • 2.单个文件最大 100 MB;
  • 3.文件名按自然日滚动;
  • 4.同名文件截断而非追加,防止“跨月”时出现重复。
# ---------- 日志是否开启 ----------
logging_collector = on                # 必须打开,日志才会真正落到文件

# ---------- 写到哪里、怎么命名 ----------
log_destination = 'stderr,csvlog'     # 可同时写普通文本+CSV
log_directory   = 'log'               # 相对 $PGDATA/log,也可写成绝对路径
log_filename    = 'postgresql-%Y-%m-%d.log'  # 每天 00:00 切换
log_file_mode   = 0600                # 权限

# ---------- 按大小 / 时间滚动 ----------
log_rotation_age   = 1d               # 每天必切
log_rotation_size  = 100MB            # 单日超过 100 MB 也切
log_truncate_on_rotation = on         # 同名文件截断,保证不会无限追加

# ---------- 保留策略 ----------
# PostgreSQL 自身不会“自动删旧日志”,需配合外部工具。
# 以下两种做法二选一(或同时用):
#
# 做法 A:logrotate(推荐)
# 在 /etc/logrotate.d/postgresql 里增加:
# /pgdata/16/main/log/*.log {
#     daily
#     missingok
#     rotate 30              # 保留 30 份
#     compress
#     delaycompress
#     copytruncate           # 适用于 logging_collector
# }
#
# 做法 B:直接让 PostgreSQL 按“30 天”滚动文件名
# 把 log_filename 改成:
# log_filename = 'postgresql-%Y-%m-%d_%H.log'
# log_rotation_age = 1h
# log_rotation_size = 0
# 这样会产生 24*30 ≈ 720 个文件,超过 30 天的文件名自然被覆盖
# (需要文件系统支持 720 个 inode,且文件名不能冲突)。

# ---------- 其他常用 ----------
log_line_prefix = '%t [%p-%l] %q%u@%d '   # 含时间戳、PID、用户名、数据库
log_checkpoints = on
log_connections = on
log_disconnections = on
log_statement   = 'ddl'               # 也可 'all' / 'mod' / 'none'
log_min_duration_statement = 1000     # 慢于 1 秒的 SQL  单位ms

使用步骤
1.把以上片段追加到 postgresql.conf,确保 log_directory 存在且权限正确。
2.SELECT pg_reload_conf(); 或 pg_ctl reload 让配置生效。
3.若用 logrotate,立即测试:
logrotate -d /etc/logrotate.d/postgresql(dry-run)。
4.第二天检查 $PGDATA/log/postgresql-YYYY-MM-DD.log 是否生成;
30 天后旧的 .log 文件会被 logrotate 删除或压缩。

posted @ 2026-05-18 13:56  数据库小白(专注)  阅读(22)  评论(0)    收藏  举报