pg_log:数据库活动日志(也就是数据库的操作日志);
pg_xlog:事务日志;
pg_clog:事务状态日志(pg_clog是pg_xlog的辅助日志)。
配置介绍
PG安装完成后默认不会记录日志,必须修改对应的(${PGDATA}/postgresql.conf)配置才可以,这里只介绍常用的日志配置。
# 是否将日志重定向至文件中,默认是off(该配置修改后,需要重启DB服务)
1.logging_collector = on/off ----
# directory where log files are written, 相对路径的${PGDATA}/log文件夹下,也可以改为绝对路径,集群目录下,但是日志文件可能会非常多,建议将日志重定向到其他目录或分区。
2. log_directory = 'log'
3.log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' ---- 日志文件命名形式,使用默认即可(也可以设置为csv文件,这样可以导入到大数据仓库中进行分析处理。)
4. log_rotation_age = 1d ---- 单个日志文件的生存期,默认1天,在日志文件大小没有达到log_rotation_size时,一天只生成一个日志文件
5. log_rotation_size = 10MB ---- 单个日志文件的大小,如果时间没有超过log_rotation_age,一个日志文件最大只能到10M,否则将新生成一个日志文件。
6.log_truncate_on_rotation = off ---- 当日志文件已存在时,该配置如果为off,新生成的日志将在文件尾部追加,如果为on,则会覆盖原来的日志。
7.log_lock_waits = off ---- 控制当一个会话等待时间超过deadlock_timeout而被锁时是否产生一个日志信息。在判断一个锁等待是否会影响性能时是有用的,缺省是off。
8.log_statement = 'none' # none, ddl, mod, all ---- 控制记录哪些SQL语句。none不记录,ddl记录所有数据定义命令,比如CREATE,ALTER,和DROP 语句。mod记录所有ddl语句,加上数据修改语句INSERT,UPDATE等,all记录所有执行的语句,将此配置设置为all可跟踪整个数据库执行的SQL语句。
9.log_duration = off ---- 记录每条SQL语句执行完成消耗的时间,将此配置设置为on,用于统计哪些SQL语句耗时较长。
10.log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements and their durations, > 0 logs only statements running at least this number of milliseconds
-1表示不可用,0将记录所有SQL语句和它们的耗时,>0只记录那些耗时超过(或等于)这个值(ms)的SQL语句。个人更喜欢使用该配置来跟踪那些耗时较长,可能存在性能问题的SQL语句。虽然使用log_statement和log_duration也能够统计SQL语句及耗时,但是SQL语句和耗时统计结果可能相差很多行,或在不同的文件中,但是log_min_duration_statement会将SQL语句和耗时在同一行记录,更方便阅读。
11.log_connections = off ----是否记录连接日志
12.log_disconnections = off ---- 是否记录连接断开日志
13.log_line_prefix = '%m %p %u %d %r ' ---- 日志输出格式(%m,%p实际意义配置文件中有解释),可根据自己需要设置(能够记录时间,用户名称,数据库名称,客户端IP和端口,方便定位问题)
14.log_timezone = 'Asia/Shanghai' ---- 日志时区,最好和服务器设置同一个时区,方便问题定位
日志输出效果
2021-12-14 17:35:45.095 CST [40] 10.6.1.29(54924) my_db postgres Navicat [idle] 00000 5/9 0 LOG: statement: UPDATE "public"."tb_user" SET "name" = '223' WHERE "name" = '123'
2021-12-14 17:35:45.097 CST [40] 10.6.1.29(54924) my_db postgres Navicat [UPDATE] 23505 5/9 883 ERROR: duplicate key value violates unique constraint "tb_user_pkey"
2021-12-14 17:35:45.097 CST [40] 10.6.1.29(54924) my_db postgres Navicat [UPDATE] 23505 5/9 883 DETAIL: Key (name)=(223) already exists.
2021-12-14 17:35:45.097 CST [40] 10.6.1.29(54924) my_db postgres Navicat [UPDATE] 23505 5/9 883 STATEMENT: UPDATE "public"."tb_user" SET "name" = '223' WHERE "name" = '123'
2021-12-14 17:36:03.367 CST [40] 10.6.1.29(54924) my_db postgres Navicat [idle] 00000 5/10 0 LOG: statement: INSERT INTO "public"."tb_user"("name") VALUES ('123') RETURNING *
2021-12-14 17:36:03.368 CST [40] 10.6.1.29(54924) my_db postgres Navicat [INSERT] 23505 5/10 884 ERROR: duplicate key value violates unique constraint "tb_user_pkey"
2021-12-14 17:36:03.368 CST [40] 10.6.1.29(54924) my_db postgres Navicat [INSERT] 23505 5/10 884 DETAIL: Key (name)=(123) already exists.
2021-12-14 17:36:03.368 CST [40] 10.6.1.29(54924) my_db postgres Navicat [INSERT] 23505 5/10 884 STATEMENT: INSERT INTO "public"."tb_user"("name") VALUES ('123') RETURNING *
2021-12-14 17:36:07.635 CST [47] [] 00000 8/0 0 LOG: stats collector's time 2021-12-14 09:36:13.725102+00 is later than backend local time 2021-12-14 09:36:07.635694+00
2021-12-14 17:36:07.635 CST [34] [] 00000 0 LOG: stats_timestamp 2021-12-14 09:36:13.725102+00 is later than collector's time 2021-12-14 09:36:07.635901+00 for database 13395