暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQ | logger process 参数详解

北重楼 2022-07-13
1219

PostgreSQ日志相关参数位于postgresql.conf的REPORTING AND LOGGING模块


1  Where to Log(日志写到哪里)

1.1 log_destination

字符串
默认:log_destination = 'stderr'stderr, csvlog, syslog, and eventlog四选一

1.2 log_directory

字符串

默认:log_directory = 'log'
决定存放数据库运行日志文件的目录。可以是绝对路径,也可是相对路径(相对于数据库文件所在的路径)。

1.3 log_filename

字符串

默认:log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
数据库运行日志文件的名称。

%Y、%m、%d、%H、%M和%S,分别表示年、月、日、小时、分和秒。
没有指定时间信息,系统会自动在log_filename值的末尾加上文件创建时间戳作为文件名。

1.4 log_truncate_on_rotation

布尔值
默认:log_truncate_on_rotation = on系统在创建一个新的数据库运行日志文件时,如果发现存在一个同名的文件,当log_truncate_on_rotation的值是on时,系统覆盖这个同名文件。
当log_truncate_on_rotation的值是off时,系统将重用这个同名文件,在它的末尾添加新的日志信息。
要注意的是,只有在log_rotation_age非零时,系统在创建新的日志文件的情况下,才会覆盖同名的日志文件。
因为数据库重新启动或者因为参数log_rotation_size起作用而创建新的日志文件,不会覆盖同名的日志文件,而是在同名的日志文件末尾添加新的日志信息。

1.5 log_rotation_age

数字型
默认:log_rotation_age = 1d ,单位是天。
单个日志文件的生存期,默认1天,在日志文件大小没有达到log_rotation_size时,一天只生成一个日志文件。

1.6 log_rotation_size

数字型
默认:log_rotation_size = 10MB
日志轮询大小,当文件大小超过该值时进行切换。
如果一个日志文件写入的数据量超过log_rotation_size的值,数据库将创建一个新的日志文件。
为0表示禁用该功能。

1.7 logging_collector

布尔值
默认:logging_collector = on是否将使捕获的stderr和csvlog写入日志文件
重启数据库生效

1.8 logfilemode

布尔值
默认:log_file_mode = 0600
创建日志文件的权限

2 何时写日志 When to Log

2.1 client_min_messages

字符型
默认:client_min_messages = notice
控制发送给客户端的消息级别。
合法的取值是debug5、debug4、debug3、debug2、debug1、log、notice、warning、error、fatal和panic,每个级别都包含排在它后面的所有级别中的信息。级别越低,发送给客户端的消息就越少。

2.2 log_min_messages

字符型

默认:log_min_messages = warning
控制写到数据库日志文件中的消息的级别。

合法的取值同client_min_messages

2.3 log_min_error_statement

字符型

默认:log_min_error_statement = error
控制日志中是否记录导致数据库出现错误的SQL语句。

2.4 log_min_duration_statement

字符型
默认:log_min_duration_statement = -1

只记录执行时间大于设定值的语句。
-1表示不可用,0将记录所有SQL语句和它们的耗时,>0只记录那些耗时超过(或等于)这个值(ms)的SQL语句。

3 What to Log

3.1 log_error_verbosity

字符型
默认:log_error_verbosity = default , terse、default、verbose三选一
控制每条日志信息的详细程度。

3.2 log_duration

布尔值
默认:log_duration = off
控制是否记录每个完成的SQL语句的执行时间。
对于使用扩展协议与数据库通信的客户端,会记载Parse、Bind和Execute的执行时间。

3.3 log_hostname

布尔值

默认:log_hostname = off
控制是否记录客户端的主机名。

如果设为on,可能会影响数据库的性能,因为解析主机名可能需要一定的时间。

3.4 log_checkpoints

布尔值

默认:log_checkpoints = off
控制是否及记录检查点操作信息。

必须重启数据库才能生效。

3.5 log_connections

布尔值

默认:log_connections = off
控制是否及记录客户端连接请求信息。

必须重启数据库才能生效。

3.6 log_disconnections

布尔值

默认:log_disconnections = off
控制是否记录客户端结束连接信息。

3.7 log_line_prefix

字符型

默认:log_line_prefix = '%m [%p] '
控制每条日志信息的前缀格式。它的格式类似c语言中printf函数的format字符串。

转义序列
%a = APP名

%u = 用户名
%d = 数据库名
%r = 客户端机器名或IP地址,还有客户端端口
%h = 客户端机器名或IP地址
%p = 进程ID
%t = 带微秒的时间
%m = 不带微秒的时间
%i = 命令标签: 会话当前执行的命令类型
%e = SQL state
%c = 会话ID
%l = 每个会话的日志编号,从1开始
%s = 进程启动时间
%v = 虚拟事务ID (backendID/localXID)
%x = 事务ID (0表示没有分配事务ID)
%q = 不产生任何输出。如果当前进程是backend进程,忽略这个转义序列,继续处理后面的转义序列。如果当前进程不是backend进程,忽略这个转义序列和它后面的所有转义序列。
%% '%' 字符%

3.8 log_lock_waits

布尔值

默认:log_lock_waits = off
如果一个会话等待某个类型的锁的时间超过deadlock_timeout的值,该参数决定是否在数据库日志中记录这个信息。

3.9 log_statement

字符型

默认:log_statement = 'none'
有效的取值是none、ddl、mod和all
控制记录哪种SQL语句的执行信息。

ddl包括所有数据定义语句,如CREATEALTERDROP语句。

mod包括所有ddl语句和更新数据的语句,例如INSERTUPDATEDELETETRUNCATECOPY FROMPREPAREEXECUTE
All包括所有的语句。

3.10 log_temp_files

数字型
默认:log_temp_files = -1 单位是KB。
控制是否记录临时文件的删除信息。
0表示记录所有临时文件的删除信息。

正整数表示只记录大小比log_temp_files的值大的临时文件的删除信息。
-1表示不记录任何临时文件删除信息。


3.11 log_timezone

字符串
默认:log_timezone = 'PRC' ,使用操作系统的时区。
设置数据库日志文件在写日志文件时使用的时区。

4 常用配置

4.1.日志记录级别

log_statement = ddl
#通常设置为ddl就够了,日志记录的详细程度也会影响性能,有更高级别需求可以设置为mod
日志级别还可以针对不同的对象进行自定义设置

1)审计用户user1连到数据库testdb 的所有SQL.

alter role user1 in database testdb set log_statement='all';

2) 审计用户user1的所有SQL.

alter role user1 set log_statement='all';

3) 审计任何用户连接到数据库testdb 的所有SQL.

alter database testdb set log_statement='all';

4.2.设置日志保留量

保留 7 天的日志,每天的一个日志文件被命令为postgresql-.Mon.log、postgresql-.Tue.log等等,并且自动用本周的日志覆盖上一周的日志。

log_filename = postgresql-.%a.log   # 日志命名
log_truncate_on_rotation = on       # 开启循环覆盖
log_rotation_age = 1440             # 每天一个日志文件
log_rotation_size = 0               # 禁用基于尺寸的新日志文件创建

参考:

Example: To keep 7 days of logs, one log file per day named server_log.Mon, server_log.Tue, etc, and automatically overwrite last week's log with this week's log, set log_filename to server_log.%a, log_truncate_on_rotation to on, and log_rotation_age to 1440.

Example: To keep 24 hours of logs, one log file per hour, but also rotate sooner if the log file size exceeds 1GB, set log_filename to server_log.%H%M, log_truncate_on_rotation to on, log_rotation_age to 60, and log_rotation_size to 1000000. Including %M in log_filename allows any size-driven rotations that might occur to select a file name different from the hour's initial file name.

4.3记录SQL 

log_min_duration_statement = 2s

#记录超过2秒的SQL,改完需要reload

4.4.记录checkpoint 

log_checkpoints = on 

4..5监控数据库的锁 

监控锁情况这个可以区分SQL慢是资源紧张还是锁等待的问题

log_lock_waits=on

deadlock_timeout=1

文章转载自北重楼,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论