Skip to content

PostgreSQL 日志格式

核心概念

PostgreSQL的日志格式是指数据库记录日志的方式和结构,主要包括以下核心概念:

  • 日志目标:日志输出的位置(如文件、syslog、stderr等)
  • 日志格式类型:日志记录的格式(如stderr、csvlog、jsonlog等)
  • 日志内容:日志中包含的信息(如时间戳、进程ID、用户名、数据库名等)
  • 日志级别:日志记录的详细程度(如debug、info、warning、error等)
  • 日志轮换:日志文件的管理策略(如按大小、按时间轮换)

日志格式类型

1. stderr格式

描述:默认的日志格式,输出到标准错误流

特点

  • 简单易读
  • 适合直接查看
  • 支持自定义格式

配置方法

sql
-- 启用stderr日志
ALTER SYSTEM SET log_destination = 'stderr';

-- 设置日志输出格式
ALTER SYSTEM SET log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h ';

-- 设置日志级别
ALTER SYSTEM SET log_min_messages = 'warning';
ALTER SYSTEM SET log_min_error_statement = 'error';

-- 应用配置
SELECT pg_reload_conf();

2. csvlog格式

描述:CSV格式的日志,适合自动化处理

特点

  • 结构化格式
  • 易于被日志分析工具处理
  • 包含详细的日志字段

配置方法

sql
-- 启用csvlog日志
ALTER SYSTEM SET log_destination = 'csvlog';

-- 设置日志目录
ALTER SYSTEM SET log_directory = 'pg_log';

-- 设置日志文件名格式
ALTER SYSTEM SET log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log';

-- 应用配置
SELECT pg_reload_conf();

3. jsonlog格式

描述:JSON格式的日志,适合现代日志分析系统

特点

  • 结构化的JSON格式
  • 易于被ELK、Graylog等日志系统处理
  • 包含完整的日志字段

配置方法

sql
-- 启用jsonlog日志(PostgreSQL 12+)
ALTER SYSTEM SET log_destination = 'jsonlog';

-- 设置日志目录和文件名
ALTER SYSTEM SET log_directory = 'pg_log';
ALTER SYSTEM SET log_filename = 'postgresql-%Y-%m-%d_%H%M%S.json';

-- 应用配置
SELECT pg_reload_conf();

4. syslog格式

描述:将日志发送到syslog服务

特点

  • 适合集中式日志管理
  • 利用现有syslog基础设施
  • 支持远程日志存储

配置方法

sql
-- 启用syslog日志
ALTER SYSTEM SET log_destination = 'syslog';

-- 设置syslog设施
ALTER SYSTEM SET syslog_facility = 'local0';

-- 设置syslog标识
ALTER SYSTEM SET syslog_ident = 'postgres';

-- 应用配置
SELECT pg_reload_conf();

日志格式配置

1. 自定义日志前缀

sql
-- 常用日志前缀配置
-- %t: 时间戳
-- %p: 进程ID
-- %l: 日志行号
-- %u: 用户名
-- %d: 数据库名
-- %a: 应用程序名
-- %h: 客户端IP地址
-- %c: 会话ID
-- %e: SQLSTATE错误码
-- %m: 日志消息
-- %n: 换行符
-- %s: 进程启动时间
-- %v: 虚拟事务ID
-- %x: 事务ID

-- 详细日志前缀
ALTER SYSTEM SET log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h,txid=%x ';

-- 简洁日志前缀
ALTER SYSTEM SET log_line_prefix = '%t [%p] ';

-- 应用配置
SELECT pg_reload_conf();

2. 配置日志内容

sql
-- 记录连接和断开连接
ALTER SYSTEM SET log_connections = 'on';
ALTER SYSTEM SET log_disconnections = 'on';

-- 记录慢查询
ALTER SYSTEM SET log_min_duration_statement = '200ms';

-- 记录所有SQL语句
ALTER SYSTEM SET log_statement = 'all';
-- 仅记录DDL语句
ALTER SYSTEM SET log_statement = 'ddl';
-- 记录DML和DDL语句
ALTER SYSTEM SET log_statement = 'mod';

-- 记录检查点信息
ALTER SYSTEM SET log_checkpoints = 'on';

-- 记录自动清理信息
ALTER SYSTEM SET log_autovacuum_min_duration = '0';

-- 应用配置
SELECT pg_reload_conf();

3. 日志轮换配置

sql
-- 启用日志收集器
ALTER SYSTEM SET logging_collector = 'on';

-- 设置日志目录
ALTER SYSTEM SET log_directory = 'pg_log';

-- 设置日志文件名格式
ALTER SYSTEM SET log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log';

-- 设置日志文件权限
ALTER SYSTEM SET log_file_mode = '0600';

-- 按大小轮换日志
ALTER SYSTEM SET log_rotation_size = '100MB';

-- 按时间轮换日志
ALTER SYSTEM SET log_rotation_age = '1d';

-- 保留日志文件数量
ALTER SYSTEM SET log_truncate_on_rotation = 'off';
ALTER SYSTEM SET log_keep_files = '7';

-- 应用配置
SELECT pg_reload_conf();

日志格式最佳实践

生产环境配置建议

  1. 选择合适的日志格式

    • 对于人工查看,使用stderr格式
    • 对于自动化处理,使用csvlog或jsonlog格式
    • 对于集中式管理,使用syslog格式
  2. 合理配置日志内容

    • 记录连接信息,便于安全审计
    • 记录慢查询,便于性能分析
    • 记录DDL语句,便于变更审计
    • 记录检查点和自动清理信息,便于系统监控
  3. 优化日志性能

    • 避免记录过多不必要的信息
    • 合理设置日志级别
    • 配置适当的日志轮换策略
    • 考虑使用异步日志写入
  4. 日志安全

    • 设置合适的日志文件权限
    • 考虑加密敏感日志内容
    • 定期备份日志文件
    • 限制日志访问权限

性能优化建议

sql
-- 优化日志性能配置
-- 启用异步日志写入
ALTER SYSTEM SET wal_writer_delay = '200ms';

-- 减少日志刷新频率
ALTER SYSTEM SET bgwriter_delay = '200ms';

-- 合理设置日志级别
ALTER SYSTEM SET log_min_messages = 'info';
ALTER SYSTEM SET log_min_error_statement = 'error';

-- 只记录重要的自动清理信息
ALTER SYSTEM SET log_autovacuum_min_duration = '1s';

-- 应用配置
SELECT pg_reload_conf();

日志格式示例

1. stderr格式示例

2025-01-24 14:30:00.123 CST [12345]: [1-1] user=app_user,db=mydb,app=psql,client=127.0.0.1 LOG:  statement: SELECT * FROM orders WHERE customer_id = 123;
2025-01-24 14:30:01.456 CST [12345]: [2-1] user=app_user,db=mydb,app=psql,client=127.0.0.1 LOG:  duration: 234.567 ms  statement: SELECT * FROM orders WHERE customer_id = 123;

2. csvlog格式示例

csv
2025-01-24 14:30:00.123 CST,12345,1,app_user,mydb,psql,127.0.0.1,,LOG,00000,statement: SELECT * FROM orders WHERE customer_id = 123;,<none>,<none>,0,0,0,0,0,0
2025-01-24 14:30:01.456 CST,12345,2,app_user,mydb,psql,127.0.0.1,,LOG,00000,duration: 234.567 ms  statement: SELECT * FROM orders WHERE customer_id = 123;,<none>,<none>,0,0,0,0,0,0

3. jsonlog格式示例

json
{
  "timestamp": "2025-01-24 14:30:00.123 CST",
  "pid": 12345,
  "session_id": "12345.67890",
  "session_line_num": 1,
  "user_name": "app_user",
  "database_name": "mydb",
  "application_name": "psql",
  "client_addr": "127.0.0.1",
  "client_port": 54321,
  "severity": "LOG",
  "sql_state_code": "00000",
  "message": "statement: SELECT * FROM orders WHERE customer_id = 123;",
  "detail": null,
  "hint": null,
  "internal_query": null,
  "internal_query_pos": null,
  "context": null,
  "query": "SELECT * FROM orders WHERE customer_id = 123;",
  "query_pos": null,
  "location": null,
  "application_name": "psql"
}

常见问题(FAQ)

Q1:如何查看当前的日志格式配置?

A1:可以使用以下命令查看当前的日志格式配置:

sql
-- 查看日志相关配置
SELECT name, setting, unit, category, short_desc 
FROM pg_settings 
WHERE category LIKE '%Logging%' 
ORDER BY category, name;

-- 查看特定日志配置
SHOW log_destination;
SHOW log_line_prefix;
SHOW log_format;

Q2:如何修改日志格式而不重启PostgreSQL?

A2:大部分日志配置参数是动态的,可以使用ALTER SYSTEM SET命令修改,然后使用SELECT pg_reload_conf()应用配置,无需重启PostgreSQL。

sql
-- 修改日志配置
ALTER SYSTEM SET log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h ';

-- 应用配置
SELECT pg_reload_conf();

Q3:如何将不同类型的日志输出到不同的目标?

A3:可以同时启用多种日志目标,使用逗号分隔:

sql
-- 同时启用stderr和csvlog
ALTER SYSTEM SET log_destination = 'stderr,csvlog';

-- 应用配置
SELECT pg_reload_conf();

Q4:如何配置日志的保留策略?

A4:可以使用以下参数配置日志的保留策略:

sql
-- 按大小轮换日志
ALTER SYSTEM SET log_rotation_size = '100MB';

-- 按时间轮换日志
ALTER SYSTEM SET log_rotation_age = '1d';

-- 保留7天的日志文件
ALTER SYSTEM SET log_keep_files = '7';

-- 应用配置
SELECT pg_reload_conf();

Q5:如何分析PostgreSQL日志?

A5:可以使用以下工具分析PostgreSQL日志:

  1. 内置工具

    • pgBadger:生成HTML格式的日志分析报告
    • pgAudit:细粒度的审计日志分析
  2. 第三方工具

    • ELK Stack(Elasticsearch, Logstash, Kibana):集中式日志管理和分析
    • Graylog:日志管理和分析平台
    • Prometheus + Grafana:监控和可视化
    • Splunk:企业级日志管理平台
  3. 命令行工具

    • grep:搜索日志内容
    • awk/sed:处理日志文本
    • tail:实时查看日志
    • less:分页查看日志

Q6:如何优化日志性能?

A6:可以通过以下方法优化日志性能:

  1. 减少日志级别:只记录必要的日志信息
  2. 合理设置日志内容:避免记录过多不必要的信息
  3. 使用异步日志:减少日志写入对主进程的影响
  4. 优化日志轮换:避免频繁的日志轮换
  5. 使用高性能存储:将日志存储在高性能磁盘上
  6. 考虑使用日志缓冲区:减少磁盘I/O次数