Skip to content

PostgreSQL 日志配置规范

日志基础配置

日志级别配置

  1. 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';
  2. 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';
  3. log_min_duration_statement

    • 描述:记录执行时间超过指定毫秒数的SQL语句
    • 建议值:
      • 生产环境:1000ms(1秒)
      • 性能调优:100ms
    • 配置示例:
      sql
      ALTER SYSTEM SET log_min_duration_statement = '1000';

日志格式配置

  1. log_destination

    • 描述:指定日志输出目标
    • 可选值:stderr, csvlog, syslog, eventlog
    • 建议值:stderr
    • 配置示例:
      sql
      ALTER SYSTEM SET log_destination = 'stderr';
  2. logging_collector

    • 描述:启用日志收集器
    • 建议值:on
    • 配置示例:
      sql
      ALTER SYSTEM SET logging_collector = 'on';
  3. log_filename

    • 描述:日志文件名格式
    • 建议值:postgresql-%Y-%m-%d_%H%M%S.log
    • 配置示例:
      sql
      ALTER SYSTEM SET log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log';
  4. log_rotation_age

    • 描述:日志文件滚动的时间间隔
    • 建议值:1d(1天)
    • 配置示例:
      sql
      ALTER SYSTEM SET log_rotation_age = '1d';
  5. log_rotation_size

    • 描述:日志文件滚动的大小限制
    • 建议值:100MB
    • 配置示例:
      sql
      ALTER SYSTEM SET log_rotation_size = '100MB';

日志内容配置

会话信息日志

  1. log_connections

    • 描述:记录客户端连接信息
    • 建议值:on
    • 配置示例:
      sql
      ALTER SYSTEM SET log_connections = 'on';
  2. log_disconnections

    • 描述:记录客户端断开连接信息
    • 建议值:on
    • 配置示例:
      sql
      ALTER SYSTEM SET log_disconnections = 'on';
  3. log_duration

    • 描述:记录每个SQL语句的执行时间
    • 建议值:off(仅在需要详细日志时开启)
    • 配置示例:
      sql
      ALTER SYSTEM SET log_duration = 'off';

错误信息日志

  1. log_error_verbosity

    • 描述:控制错误日志的详细程度
    • 可选值:TERSE, DEFAULT, VERBOSE
    • 建议值:DEFAULT
    • 配置示例:
      sql
      ALTER SYSTEM SET log_error_verbosity = 'DEFAULT';
  2. log_statement

    • 描述:记录执行的SQL语句类型
    • 可选值:none, ddl, mod, all
    • 建议值:
      • 生产环境:ddl或none
      • 审计需求:all
    • 配置示例:
      sql
      ALTER SYSTEM SET log_statement = 'ddl';
  3. log_lock_waits

    • 描述:记录锁等待事件
    • 建议值:on
    • 配置示例:
      sql
      ALTER SYSTEM SET log_lock_waits = 'on';

日志输出格式

CSV日志格式

  1. csvlog配置

    sql
    -- 启用CSV日志格式
    ALTER SYSTEM SET log_destination = 'csvlog';
    ALTER SYSTEM SET logging_collector = 'on';
  2. CSV日志字段

    • 包含时间戳、用户、数据库、进程ID、日志级别、消息等字段
    • 便于日志分析工具处理

自定义日志格式

  1. 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 ';
  2. log_timezone

    • 描述:日志时间戳时区
    • 建议值:Asia/Shanghai
    • 配置示例:
      sql
      ALTER SYSTEM SET log_timezone = 'Asia/Shanghai';

日志性能优化

日志对性能的影响

  1. 日志级别与性能

    • 日志级别越详细,对性能影响越大
    • 建议生产环境使用warning或notice级别
  2. 日志收集器配置

    sql
    -- 优化日志收集器
    ALTER SYSTEM SET log_truncate_on_rotation = 'on';
    ALTER SYSTEM SET log_keep_files = '7';
    ALTER SYSTEM SET log_compression = 'on';
  3. 异步日志

    • PostgreSQL 14+支持异步日志
    • 配置示例:
      sql
      ALTER SYSTEM SET wal_level = 'replica';
      ALTER SYSTEM SET logging_collector = 'on';

日志监控与管理

日志监控指标

  1. 日志增长速率

    bash
    # 监控日志目录大小增长
    du -sh /path/to/logs/ && sleep 3600 && du -sh /path/to/logs/
  2. 错误日志统计

    bash
    # 统计错误日志数量
    grep -i error /path/to/logs/*.log | wc -l
    
    # 统计警告日志数量
    grep -i warning /path/to/logs/*.log | wc -l

日志管理策略

  1. 日志保留策略

    sql
    -- 设置日志保留数量
    ALTER SYSTEM SET log_keep_files = '14';
    
    -- 设置日志保留时间
    ALTER SYSTEM SET log_rotation_age = '1d';
  2. 日志归档

    bash
    # 使用logrotate管理PostgreSQL日志
    # 创建/etc/logrotate.d/postgresql文件
    /path/to/logs/*.log {
        daily
        rotate 14
        compress
        delaycompress
        missingok
        notifempty
        create 0644 postgres postgres
    }
  3. 日志分析工具

    • pgBadger:生成PostgreSQL日志报告
    • pgAudit:详细审计日志
    • ELK Stack:集中式日志管理

版本差异

PostgreSQL 13-14

  1. 异步日志支持
    • PostgreSQL 14引入异步日志功能
    • 配置示例:
      sql
      ALTER SYSTEM SET wal_level = 'replica';

PostgreSQL 14-15

  1. 日志格式增强
    • 改进了日志行前缀的灵活性
    • 新增了更多日志字段

PostgreSQL 15-16

  1. 日志性能优化
    • 优化了日志写入路径
    • 减少了日志对主业务的影响

最佳实践

生产环境配置建议

  1. 基础日志配置

    sql
    ALTER 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';
  2. 日志内容配置

    sql
    ALTER 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';
  3. 日志格式配置

    sql
    ALTER SYSTEM SET log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h ';
    ALTER SYSTEM SET log_timezone = 'Asia/Shanghai';

日志分析最佳实践

  1. 定期分析日志

    • 每周生成日志报告
    • 监控慢查询和错误
  2. 使用自动化工具

    bash
    # 使用pgBadger生成日志报告
    pgbadger /path/to/logs/*.log -o postgresql_report.html
  3. 设置告警

    • 监控日志中的错误和警告
    • 配置阈值告警

常见问题(FAQ)

Q1:日志文件增长过快怎么办?

A1:

  1. 调整日志级别,降低详细程度
  2. 增加log_rotation_size或减少log_rotation_age
  3. 启用log_compression
  4. 调整log_keep_files,减少保留数量
  5. 考虑使用日志轮转工具(如logrotate)

Q2:如何定位慢查询?

A2:

  1. 配置log_min_duration_statement参数
  2. 使用pg_stat_statements扩展
  3. 分析日志中的慢查询记录
  4. 使用pgBadger生成慢查询报告

Q3:日志中出现大量锁等待怎么办?

A3:

  1. 检查log_lock_waits日志
  2. 分析锁等待的SQL语句
  3. 优化查询,减少锁持有时间
  4. 考虑调整事务隔离级别
  5. 增加资源配置,减少竞争

Q4:如何配置审计日志?

A4:

  1. 使用pgAudit扩展
  2. 配置log_statement = 'all'
  3. 结合外部日志管理系统
  4. 示例配置:
    sql
    CREATE EXTENSION pgaudit;
    ALTER SYSTEM SET pgaudit.log = 'all';
    ALTER SYSTEM SET pgaudit.log_catalog = 'on';

Q5:如何确保日志的安全性?

A5:

  1. 设置正确的日志文件权限(0640)
  2. 限制日志文件访问
  3. 加密敏感信息
  4. 定期备份日志
  5. 配置合适的日志保留策略