Ubuntu 上高效管理 PostgreSQL 日志的实用技巧
一 日志位置与快速查看
sudo journalctl -u postgresql.service -f。sudo tail -f /var/log/postgresql/postgresql-14-main.logsudo journalctl -u postgresql.service -f --since "2025-11-19 00:00:00" --until "2025-11-19 12:00:00"。二 核心参数与推荐配置
logging_collector = onlog_destination = 'csvlog'(便于解析;也可同时保留 stderr)log_directory = 'pg_log'(相对 $PGDATA)log_filename = 'postgresql-%Y-%m-%d.log'log_rotation_age = 1dlog_rotation_size = 100MBlog_truncate_on_rotation = on(同名文件轮转时覆盖,避免追加膨胀)log_checkpoints = onlog_connections = onlog_disconnections = onlog_lock_waits = onlog_min_duration_statement = 1000(单位毫秒,记录超过 1 秒 的慢查询)log_statement = 'ddl'(按需:none/ddl/mod/all)sudo systemctl restart postgresql(或 pg_ctl restart)。三 日志轮转与自动清理
log_rotation_age 与 log_rotation_size 控制按天或按大小切分,配合 log_truncate_on_rotation = on 避免同名文件追加。/etc/logrotate.d/postgresql/var/log/postgresql/*.log {
daily
rotate 7
missingok
compress
delaycompress
notifempty
create 0600 postgres postgres
sharedscripts
postrotate
systemctl reload postgresql >/dev/null 2>&1 || true
endscript
}
sudo crontab -e -u postgres0 1 * * * find /var/lib/postgresql/14/main/pg_log -type f \( -name '*.log' -o -name '*.csv' \) -mtime +7 -delete >/dev/null 2>&1四 日志分析与可视化
pgbadger --versionpgbadger /var/lib/postgresql/14/main/pg_log/postgresql-*.log -o /var/www/html/report.htmlpgbadger --begin='2025-04-20 00:00:00' --end='2025-04-24 23:59:59' *.log0 2 * * * /usr/bin/pgbadger /var/lib/postgresql/14/main/pg_log/postgresql-$(date -d "yesterday" +"%Y-%m-%d").log -o /var/www/html/report.htmlCREATE TABLE IF NOT EXISTS postgres_log (
log_time timestamp(3) with time zone,
user_name text,
database_name text,
process_id integer,
connection_from text,
session_id text,
session_line_num bigint,
command_tag text,
session_start_time timestamp with time zone,
virtual_transaction_id text,
transaction_id bigint,
error_severity text,
sql_state_code text,
message text,
detail text,
hint text,
internal_query text,
internal_query_pos integer,
context text,
query text,
query_pos integer,
location text,
application_name text,
backend_type text
);
COPY postgres_log FROM '/var/lib/postgresql/14/main/pg_log/postgresql-2025-11-19.csv' WITH (FORMAT csv, HEADER true);五 易混淆的日志与注意事项
log_statement = 'all' 与 log_duration = on 同时记录,易产生大量日志;优先使用 log_min_duration_statement 定位慢 SQL。