外观
PostgreSQL 日志配置规范
日志基础配置
日志级别配置
log_min_messages
- 描述:控制日志消息的详细程度
- 可选值:debug5, debug4, debug3, debug2, debug1, info, notice, warning, error, log, fatal, panic
- 建议值:
- 生产环境:warning或notice
- 开发环境:info或debug1
- 配置示例:sql
ALTER SYSTEM SET log_min_messages = 'warning';
log_min_error_statement
- 描述:控制记录哪些级别的SQL语句错误
- 可选值:debug5, debug4, debug3, debug2, debug1, info, notice, warning, error, log, fatal, panic, none
- 建议值:error
- 配置示例:sql
ALTER SYSTEM SET log_min_error_statement = 'error';
log_min_duration_statement
- 描述:记录执行时间超过指定毫秒数的SQL语句
- 建议值:
- 生产环境:1000ms(1秒)
- 性能调优:100ms
- 配置示例:sql
ALTER SYSTEM SET log_min_duration_statement = '1000';
日志格式配置
log_destination
- 描述:指定日志输出目标
- 可选值:stderr, csvlog, syslog, eventlog
- 建议值:stderr
- 配置示例:sql
ALTER SYSTEM SET log_destination = 'stderr';
logging_collector
- 描述:启用日志收集器
- 建议值:on
- 配置示例:sql
ALTER SYSTEM SET logging_collector = 'on';
log_filename
- 描述:日志文件名格式
- 建议值:postgresql-%Y-%m-%d_%H%M%S.log
- 配置示例:sql
ALTER SYSTEM SET log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log';
log_rotation_age
- 描述:日志文件滚动的时间间隔
- 建议值:1d(1天)
- 配置示例:sql
ALTER SYSTEM SET log_rotation_age = '1d';
log_rotation_size
- 描述:日志文件滚动的大小限制
- 建议值:100MB
- 配置示例:sql
ALTER SYSTEM SET log_rotation_size = '100MB';
日志内容配置
会话信息日志
log_connections
- 描述:记录客户端连接信息
- 建议值:on
- 配置示例:sql
ALTER SYSTEM SET log_connections = 'on';
log_disconnections
- 描述:记录客户端断开连接信息
- 建议值:on
- 配置示例:sql
ALTER SYSTEM SET log_disconnections = 'on';
log_duration
- 描述:记录每个SQL语句的执行时间
- 建议值:off(仅在需要详细日志时开启)
- 配置示例:sql
ALTER SYSTEM SET log_duration = 'off';
错误信息日志
log_error_verbosity
- 描述:控制错误日志的详细程度
- 可选值:TERSE, DEFAULT, VERBOSE
- 建议值:DEFAULT
- 配置示例:sql
ALTER SYSTEM SET log_error_verbosity = 'DEFAULT';
log_statement
- 描述:记录执行的SQL语句类型
- 可选值:none, ddl, mod, all
- 建议值:
- 生产环境:ddl或none
- 审计需求:all
- 配置示例:sql
ALTER SYSTEM SET log_statement = 'ddl';
log_lock_waits
- 描述:记录锁等待事件
- 建议值:on
- 配置示例:sql
ALTER SYSTEM SET log_lock_waits = 'on';
日志输出格式
CSV日志格式
csvlog配置
sql-- 启用CSV日志格式 ALTER SYSTEM SET log_destination = 'csvlog'; ALTER SYSTEM SET logging_collector = 'on';CSV日志字段
- 包含时间戳、用户、数据库、进程ID、日志级别、消息等字段
- 便于日志分析工具处理
自定义日志格式
log_line_prefix
- 描述:自定义日志行前缀
- 建议值:'%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
- 配置示例:sql
ALTER SYSTEM SET log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h ';
log_timezone
- 描述:日志时间戳时区
- 建议值:Asia/Shanghai
- 配置示例:sql
ALTER SYSTEM SET log_timezone = 'Asia/Shanghai';
日志性能优化
日志对性能的影响
日志级别与性能
- 日志级别越详细,对性能影响越大
- 建议生产环境使用warning或notice级别
日志收集器配置
sql-- 优化日志收集器 ALTER SYSTEM SET log_truncate_on_rotation = 'on'; ALTER SYSTEM SET log_keep_files = '7'; ALTER SYSTEM SET log_compression = 'on';异步日志
- PostgreSQL 14+支持异步日志
- 配置示例:sql
ALTER SYSTEM SET wal_level = 'replica'; ALTER SYSTEM SET logging_collector = 'on';
日志监控与管理
日志监控指标
日志增长速率
bash# 监控日志目录大小增长 du -sh /path/to/logs/ && sleep 3600 && du -sh /path/to/logs/错误日志统计
bash# 统计错误日志数量 grep -i error /path/to/logs/*.log | wc -l # 统计警告日志数量 grep -i warning /path/to/logs/*.log | wc -l
日志管理策略
日志保留策略
sql-- 设置日志保留数量 ALTER SYSTEM SET log_keep_files = '14'; -- 设置日志保留时间 ALTER SYSTEM SET log_rotation_age = '1d';日志归档
bash# 使用logrotate管理PostgreSQL日志 # 创建/etc/logrotate.d/postgresql文件 /path/to/logs/*.log { daily rotate 14 compress delaycompress missingok notifempty create 0644 postgres postgres }日志分析工具
- pgBadger:生成PostgreSQL日志报告
- pgAudit:详细审计日志
- ELK Stack:集中式日志管理
版本差异
PostgreSQL 13-14
- 异步日志支持
- PostgreSQL 14引入异步日志功能
- 配置示例:sql
ALTER SYSTEM SET wal_level = 'replica';
PostgreSQL 14-15
- 日志格式增强
- 改进了日志行前缀的灵活性
- 新增了更多日志字段
PostgreSQL 15-16
- 日志性能优化
- 优化了日志写入路径
- 减少了日志对主业务的影响
最佳实践
生产环境配置建议
基础日志配置
sqlALTER SYSTEM SET log_destination = 'stderr'; ALTER SYSTEM SET logging_collector = 'on'; 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'; ALTER SYSTEM SET log_keep_files = '14'; ALTER SYSTEM SET log_compression = 'on';日志内容配置
sqlALTER SYSTEM SET log_min_messages = 'warning'; ALTER SYSTEM SET log_min_error_statement = 'error'; ALTER SYSTEM SET log_min_duration_statement = '1000'; ALTER SYSTEM SET log_statement = 'ddl'; ALTER SYSTEM SET log_connections = 'on'; ALTER SYSTEM SET log_disconnections = 'on'; ALTER SYSTEM SET log_lock_waits = 'on';日志格式配置
sqlALTER SYSTEM SET log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '; ALTER SYSTEM SET log_timezone = 'Asia/Shanghai';
日志分析最佳实践
定期分析日志
- 每周生成日志报告
- 监控慢查询和错误
使用自动化工具
bash# 使用pgBadger生成日志报告 pgbadger /path/to/logs/*.log -o postgresql_report.html设置告警
- 监控日志中的错误和警告
- 配置阈值告警
常见问题(FAQ)
Q1:日志文件增长过快怎么办?
A1:
- 调整日志级别,降低详细程度
- 增加log_rotation_size或减少log_rotation_age
- 启用log_compression
- 调整log_keep_files,减少保留数量
- 考虑使用日志轮转工具(如logrotate)
Q2:如何定位慢查询?
A2:
- 配置log_min_duration_statement参数
- 使用pg_stat_statements扩展
- 分析日志中的慢查询记录
- 使用pgBadger生成慢查询报告
Q3:日志中出现大量锁等待怎么办?
A3:
- 检查log_lock_waits日志
- 分析锁等待的SQL语句
- 优化查询,减少锁持有时间
- 考虑调整事务隔离级别
- 增加资源配置,减少竞争
Q4:如何配置审计日志?
A4:
- 使用pgAudit扩展
- 配置log_statement = 'all'
- 结合外部日志管理系统
- 示例配置:sql
CREATE EXTENSION pgaudit; ALTER SYSTEM SET pgaudit.log = 'all'; ALTER SYSTEM SET pgaudit.log_catalog = 'on';
Q5:如何确保日志的安全性?
A5:
- 设置正确的日志文件权限(0640)
- 限制日志文件访问
- 加密敏感信息
- 定期备份日志
- 配置合适的日志保留策略
