外观
PostgreSQL 日志相关参数
日志基础配置参数
log_destination
控制日志输出的目标位置,支持多种输出格式同时使用,常用值包括:
stderr:标准错误输出csvlog:CSV格式日志syslog:系统日志eventlog:Windows事件日志
sql
-- 设置日志输出目标为stderr和csvlog
ALTER SYSTEM SET log_destination = 'stderr,csvlog';
-- 验证配置
SHOW log_destination;logging_collector
是否启用日志收集器,建议在生产环境中启用:
sql
-- 启用日志收集器
ALTER SYSTEM SET logging_collector = on;
-- 验证配置
SHOW logging_collector;log_directory
指定日志文件存储目录,建议使用绝对路径:
sql
-- 设置日志存储目录
ALTER SYSTEM SET log_directory = '/var/log/postgresql';
-- 验证配置
SHOW log_directory;日志格式配置参数
log_line_prefix
定义日志行的前缀格式,包含时间戳、进程ID等信息,常用配置:
sql
-- 详细日志前缀格式
ALTER SYSTEM SET log_line_prefix = '%t [%p]: [%c-%l] %d %u %a %h %m %i %e ';
-- 简化日志前缀格式
ALTER SYSTEM SET log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h ';
-- 验证配置
SHOW log_line_prefix;log_timezone
设置日志时间的时区,建议与系统时区保持一致:
sql
-- 设置日志时区为Asia/Shanghai
ALTER SYSTEM SET log_timezone = 'Asia/Shanghai';
-- 验证配置
SHOW log_timezone;日志级别与内容配置
log_min_messages
控制写入日志的消息级别,生产环境常用值:
warning:记录警告及以上级别的消息notice:记录通知及以上级别的消息error:仅记录错误及以上级别的消息
sql
-- 设置日志级别为warning
ALTER SYSTEM SET log_min_messages = warning;
-- 验证配置
SHOW log_min_messages;log_min_error_statement
控制记录导致错误的SQL语句的级别:
sql
-- 记录所有导致错误的SQL语句
ALTER SYSTEM SET log_min_error_statement = error;
-- 验证配置
SHOW log_min_error_statement;log_statement
控制记录哪些SQL语句,生产环境常用配置:
none:不记录任何SQL语句ddl:仅记录DDL语句mod:记录DDL和DML语句all:记录所有SQL语句
sql
-- 记录DDL和DML语句
ALTER SYSTEM SET log_statement = mod;
-- 验证配置
SHOW log_statement;log_min_duration_statement
记录执行时间超过指定毫秒数的SQL语句,生产环境建议设置为100-1000毫秒:
sql
-- 记录执行时间超过500毫秒的SQL语句
ALTER SYSTEM SET log_min_duration_statement = 500;
-- 不记录任何SQL语句执行时间
ALTER SYSTEM SET log_min_duration_statement = -1;
-- 验证配置
SHOW log_min_duration_statement;日志旋转与管理参数
log_rotation_age
控制日志文件的最大保留时间,默认1d(1天):
sql
-- 设置日志保留时间为12小时
ALTER SYSTEM SET log_rotation_age = 12h;
-- 验证配置
SHOW log_rotation_age;log_rotation_size
控制日志文件的最大大小,默认10MB:
sql
-- 设置日志文件大小上限为50MB
ALTER SYSTEM SET log_rotation_size = 50MB;
-- 验证配置
SHOW log_rotation_size;log_truncate_on_rotation
当日志文件已存在时,是否截断而非追加:
sql
-- 启用日志截断
ALTER SYSTEM SET log_truncate_on_rotation = on;
-- 验证配置
SHOW log_truncate_on_rotation;log_filename
定义日志文件名格式,支持时间变量:
sql
-- 设置日志文件名格式
ALTER SYSTEM SET log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log';
-- 验证配置
SHOW log_filename;错误与警告日志参数
log_error_verbosity
控制错误消息的详细程度,常用值:
TERSE:简洁格式DEFAULT:默认格式VERBOSE:详细格式,包含堆栈跟踪
sql
-- 设置错误消息详细程度为VERBOSE
ALTER SYSTEM SET log_error_verbosity = VERBOSE;
-- 验证配置
SHOW log_error_verbosity;log_exception_connections
是否记录连接失败的尝试:
sql
-- 启用连接失败日志
ALTER SYSTEM SET log_exception_connections = on;
-- 验证配置
SHOW log_exception_connections;log_disconnections
是否记录客户端断开连接的信息:
sql
-- 启用断开连接日志
ALTER SYSTEM SET log_disconnections = on;
-- 验证配置
SHOW log_disconnections;自动分析与真空日志参数
log_autovacuum_min_duration
记录执行时间超过指定毫秒数的自动VACUUM和ANALYZE操作:
sql
-- 记录所有自动VACUUM和ANALYZE操作
ALTER SYSTEM SET log_autovacuum_min_duration = 0;
-- 记录执行时间超过1秒的自动VACUUM和ANALYZE操作
ALTER SYSTEM SET log_autovacuum_min_duration = 1000;
-- 验证配置
SHOW log_autovacuum_min_duration;log_vacuum_min_duration
记录执行时间超过指定毫秒数的手动VACUUM操作:
sql
-- 记录执行时间超过500毫秒的手动VACUUM操作
ALTER SYSTEM SET log_vacuum_min_duration = 500;
-- 验证配置
SHOW log_vacuum_min_duration;生产环境最佳实践
基础配置建议
sql
-- 基础日志配置
ALTER SYSTEM SET log_destination = 'stderr,csvlog';
ALTER SYSTEM SET logging_collector = on;
ALTER SYSTEM SET log_directory = '/var/log/postgresql';
ALTER SYSTEM SET log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log';
ALTER SYSTEM SET log_rotation_age = 1d;
ALTER SYSTEM SET log_rotation_size = 100MB;
ALTER SYSTEM SET log_truncate_on_rotation = on;性能监控配置
sql
-- 性能监控日志配置
ALTER SYSTEM SET log_statement = 'mod';
ALTER SYSTEM SET log_min_duration_statement = 500;
ALTER SYSTEM SET log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h ';
ALTER SYSTEM SET log_autovacuum_min_duration = 1000;安全审计配置
sql
-- 安全审计日志配置
ALTER SYSTEM SET log_connections = on;
ALTER SYSTEM SET log_disconnections = on;
ALTER SYSTEM SET log_statement = 'all';
ALTER SYSTEM SET log_min_messages = 'warning';
ALTER SYSTEM SET log_min_error_statement = 'error';常见问题及解决方案
1. 日志文件过大
问题:日志文件增长过快,占用大量磁盘空间
解决方案:
sql
-- 调整日志旋转策略
ALTER SYSTEM SET log_rotation_size = 50MB;
ALTER SYSTEM SET log_rotation_age = 6h;
-- 调整日志级别,减少日志量
ALTER SYSTEM SET log_min_messages = 'error';
ALTER SYSTEM SET log_min_duration_statement = 1000;2. 日志中缺少慢查询
问题:配置了log_min_duration_statement但未记录慢查询
解决方案:
sql
-- 检查参数配置
SHOW log_min_duration_statement;
-- 确保日志级别足够低
ALTER SYSTEM SET log_min_messages = 'notice';
-- 检查是否启用了日志收集
SHOW logging_collector;3. 日志时间与系统时间不一致
问题:日志中的时间戳与系统时间不符
解决方案:
sql
-- 检查日志时区配置
SHOW log_timezone;
-- 设置正确的时区
ALTER SYSTEM SET log_timezone = 'Asia/Shanghai';
-- 检查系统时区
SHOW timezone;常见问题(FAQ)
Q1:如何查看当前有效的日志参数?
A1:可以使用以下命令查看所有日志相关参数:
sql
-- 查看所有日志相关参数
SELECT name, setting, unit, context, vartype
FROM pg_settings
WHERE name LIKE '%log%'
ORDER BY name;Q2:哪些日志参数需要重启数据库才能生效?
A2:以下是一些需要重启的常见日志参数:
log_destinationlogging_collectorlog_directorylog_filenamelog_rotation_agelog_rotation_size
可以通过查询pg_settings的context字段判断参数是否需要重启:
sql
-- 查看需要重启的日志参数
SELECT name, context
FROM pg_settings
WHERE name LIKE '%log%' AND context = 'postmaster';Q3:如何配置慢查询日志?
A3:配置慢查询日志需要设置以下参数:
sql
-- 记录执行时间超过500毫秒的SQL语句
ALTER SYSTEM SET log_min_duration_statement = 500;
-- 设置日志格式,包含详细信息
ALTER SYSTEM SET log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h ';
-- 确保日志级别足够低
ALTER SYSTEM SET log_min_messages = 'notice';Q4:如何清理旧日志文件?
A4:可以使用以下方法清理旧日志:
- 使用
log_rotation_age和log_rotation_size自动管理 - 使用cron定时任务清理旧日志:
bash
# 保留最近7天的日志
find /var/log/postgresql -name "postgresql-*.log" -mtime +7 -delete- 配置logrotate工具进行日志管理
Q5:如何分析PostgreSQL日志?
A5:常用的日志分析工具包括:
pgBadger:生成HTML格式的日志分析报告pgsi:PostgreSQL日志统计工具- 自定义脚本分析CSV格式日志
- ELK Stack(Elasticsearch, Logstash, Kibana)进行集中式日志管理和分析
