日志文件

PostgreSQL 有三种日志,分别是 pg_log(数据库运行日志),pg_xlog(WAL 日志),pg_clog(事务提交日志)。

日志所在路径

pg_xlog和pg_clog一般是在$PGDATA下面的文件夹下。

pg_log默认路径是$PGDATA/pg_log,实际路径可以在$PGDATA/postgresql.conf文件中设置。

日志内容

pg_log这个日志一般是记录服务器与DB的状态,比如各种Error信息,定位慢查询SQL,数据库的启动关闭信息,发生checkpoint过于频繁等的告警信息,诸如此类。

该日志有.csv格式和.log。建议使用.csv格式,因为它一般会按大小和时间自动切割,毕竟查看一个巨大的日志文件比查看不同时间段的多个日志要难得多。

pg_xlog 记录的是 PostgreSQL 的 WAL 信息,也就是一些事务日志信息。

pg_clog 记录的是事务的状态信息。

关于这两个日志到后面的进阶篇会进行详细的解读,这里就只需要记住有这两个日志就行了。

配置文件中与日志相关的配置项

这些配置项都在配置文件postgresql.conf中。

配置项

配置说明

logging_collector = on/off

是否将日志重定向至文件中,默认是off。

log_destination = stderr, csvlog, jsonlog, syslog, and eventlog

日志文件的格式

log_directory = 'pg_log'

日志文件目录,默认是PGDATA的相对路径,即PGDATA的相对路径,即{PGDATA}/pg_log,也可以改为绝对路径。日志文件可能会非常多,建议将日志重定向到其他目录或分区。将此配置修改其他目录时,必须先创建此目录,并修改权限,使得postgres用户对该目录有写权限。

log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

日志文件命名形式,使用默认即可

log_rotation_age = 1d

单个日志文件的生存期,默认1天,在日志文件大小没有达到log_rotation_size时,一天只生成一个日志文件。

log_rotation_size = 10MB

单个日志文件的大小,如果时间没有超过log_rotation_age,一个日志文件最大只能到10M,否则将新生成一个日志文件。

log_truncate_on_rotation = off

当日志文件已存在时,该配置如果为off,新生成的日志将在文件尾部追加,如果为on,则会覆盖原来的日志。

log_lock_waits = off

控制当一个会话等待时间超过deadlock_timeout而被锁时是否产生一个日志信息。在判断一个锁等待是否会影响性能时是有用的,缺省是off。

log_statement = 'none | ddl | mod | all'

记录用户登录数据库后的各种操作,none不记录,ddl记录所有数据定义命令,比如CREATE,ALTER和DROP 语句。mod记录所有ddl语句,加上数据修改语句INSERT,UPDATE等。all记录所有执行的语句,将此配置设置为all可跟踪整个数据库执行的SQL语句。

log_duration = off

记录每条SQL语句执行完成消耗的时间,将此配置设置为on,用于统计哪些SQL语句耗时较长。

log_min_duration_statement = -1

-1表示关闭记录。0表示记录所有statements的执行时间按,若为>0(单位为ms)的一个值,则记录执行时间大于该值的statements。

log_connections = off

是否记录连接日志

log_disconnections = off

是否记录连接断开日志

log_line_prefix = '%m %p %u %d %r ’

日志输出格式(%m,%p实际意义配置文件中有解释),可根据自己需要设置(能够记录时间,用户名称,数据库名称,客户端IP和端口,方便定位问题)。

log_timezone = ‘Asia/Shanghai’

日志时区,最好和服务器设置同一个时区,方便问题定位

把日志导入数据库查看

当查看日志时,由于日志文件的可读性较差,可以通过下面方法将CSV日志导入到数据库表里。

1.调整参数

log_destination = 'csvlog'

logging_collector = on

2.建表(该 SQL 目前只适用 17 版本)

CREATE TABLE 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,         -- PostgreSQL 13+
  leader_pid integer,        -- PostgreSQL 14+
  query_id bigint            -- PostgreSQL 14+
);

3.使用copy命令导入数据,然后就可以通过sql语句进行分析。

COPY postgres_log FROM 'd:\\datafile\\postgresql-2018-04-17_094948.csv' WITH csv;

使用pg_badger工具查看日志

安装并使用专用日志分析工具:

# 安装pgBadger
sudo apt-get install pgbadger  # Debian/Ubuntu
sudo yum install pgbadger     # RHEL/CentOS

# 分析日志
pgbadger /var/lib/pgsql/data/log/*.csv -o report.html