postgresql.conf 参数设置之 日志篇

610 阅读5分钟

小知识,大挑战!本文正在参与“   程序员必备小知识   ”创作活动
本文同时参与 「掘力星计划」   ,赢取创作大礼包,挑战创作激励金
参考了阿里云最佳实践,和 postgresql 官方手册,研究学习设置 postgresql.conf 参数。(下列只列出需要修改的参数,默认值即为合适值的没有列出。)

日志相关设置

log_destination = 'csvlog'             
logging_collector = on          
log_directory = '/app/pg12.4/logs'        
log_filename = 'postgresql-%a.log'
log_file_mode = 0600     
log_truncate_on_rotation = on       
log_rotation_age = 1d                 
log_rotation_size = 1GB        
log_min_duration_statement = 5s     
log_checkpoints = on
log_connections = on
log_disconnections = on
log_error_verbosity = verbose         
log_line_prefix = '%m [%p] %q %u %d %a %r %e '       
log_statement = 'ddl'                  
log_timezone = 'PRC'

log_destination:有三种输出方法,stderr,csvlog,syslog;在windows上还支持eventlog。默认是stderr,如果使用csvlog的话,logging_collector必须开启。也可以同时使用csvlog和stderr,会记录两种格式的日志。
logging_collector:日志收集器,它是一个捕捉被发送到stderr的日志消息的后台进程,并且它会将这些消息重定向到日志文件中,默认是OFF。
log_directory:日志保存路径,当logging_collector被启用时,这个参数决定日志文件将被在哪个目录下创建。
log_filename:日志名格式,默认是postgresql-%Y-%m-%d_%H%M%S.log。
log_file_mode:默认的权限是0600,表示只有服务器拥有者才能读取或写入日志文件。其他常用的设置是0640,它允许拥有者的组成员读取文件。不过要注意你需要修改log_directory为将文件存储在集簇数据目录之外的某个位置,才能利用这个设置。在任何情况下,让日志文件变成任何人都可读是不明智的,因为日志文件中可能包含敏感数据。
log_truncate_on_rotation:当logging_collector被启用时,这个参数将导致 PostgreSQL截断(覆盖而不是追加)任何已有的同名日志文件。不过,截断只在一个新文件由于基于时间的轮转被打开时发生,在基于尺寸的轮转时不会发生。如果被关闭,在所有情况下以前存在的文件将被追加。
log_rotation_age:当logging_collector被启用时,这个参数决定使用一个单个日志文件的最大时间量,之后将创立一个新的日志文件,默认为24小时。 将这个参数设置为零将禁用基于时间的新日志文件创建。
log_rotation_size:当logging_collector被启用时,这个参数决定一个个体日志文件的最大尺寸。当这些数据量被发送到一个日志文件后,将创建一个新的日志文件,默认值是10M。设置为零时将禁用基于大小创建新的日志文件。
log_min_duration_statement:记录慢 sql 的时间阀值,超过这个时间的 sql 将会被记录到日志中,默认值为 -1,不记录慢sql。
log_checkpoints:控制检查点和重启点是否被记录在服务器日志中,一些统计信息也被包括在日志消息中,包括写入缓冲区的数据和写它们所花的时间,默认值是关闭。
log_connections:控制连接信息是否被记录,尝试对服务器的连接被记录,客户端认证的成功完成也会被记录,在会话中它不能被更改,默认为off。
log_disconnections:控制会话终止是否被记录。日志输出提供的信息类似于 log_connections,不过还外加会话的持续时间,在会话中它不能被更改,默认为off。
log_error_verbosity:有效值是TERSE、DEFAULT和VERBOSE。TERSE排除记录DETAIL、HINT、QUERY和CONTEXT错误信息。VERBOSE输出包括SQLSTATE错误码以及产生错误的源代码文件名、函数名和行号。 默认是 DEFAULT。
log_line_prefix:设置日志中几率哪些内容,默认值是'%m [%p] ',记录时间戳和进程ID。
log_statement:控制哪些 SQL 语句被记录。有效值是 none (off)、ddl、mod和 all(所有语句),mod记录所有ddl语句,外加数据修改语句例如INSERT, UPDATE、DELETE、TRUNCATE, 和COPY FROM。 如果PREPARE、EXECUTE和 EXPLAIN ANALYZE包含合适类型的命令,它们也会被记录。默认是 none。
log_timezone:设置在服务器日志中写入的时间戳的时区,默认值是GMT。

log_filename 格式符说明

%a:星期的英文单词的缩写:如星期一, 则返回 Mon
%A:星期的英文单词的全拼:如星期一,返回 Monday
%b:月份的英文单词的缩写:如一月, 则返回 Jan
%B:月份的引文单词的缩写:如一月, 则返回 January
%c:返回datetime的字符串表示,如03/08/15 23:01:26
%d:返回的是当前时间是当前月的第几天
%f:微秒的表示: 范围: [0,999999]
%H:以24小时制表示当前小时
%I:以12小时制表示当前小时
%j:返回 当天是当年的第几天 范围[001,366]
%m:返回月份 范围[0,12]
%M:返回分钟数 范围 [0,59]
%P:返回是上午还是下午–AM or PM
%S:返回秒数 范围 [0,61]。。。手册说明的
%U:返回当周是当年的第几周 以周日为第一天
%W:返回当周是当年的第几周 以周一为第一天
%w:当天在当周的天数,范围为[0, 6],6表示星期天
%x:日期的字符串表示 :03/08/15
%X:时间的字符串表示 :23:22:08
%y:两个数字表示的年份 15
%Y:四个数字表示的年份 2015
%z:与utc时间的间隔 (如果是本地时间,返回空字符串)
%Z:时区名称(如果是本地时间,返回空字符串)

log_line_prefix 格式符说明

%a:应用名
%u:用户名
%d:数据库名
%r:远程主机名或 IP 地址,以及远程端口
%h:远程主机名或 IP 地址
%b:后端类型
%p:进程 ID
%t:无毫秒的时间戳
%m:带毫秒的时间戳
%n:带毫秒的时间戳(作为 Unix 时代)
%i:命令标签:会话当前命令的类型
%e:SQLSTATE 错误代码
%c:会话 ID:见下文
%l:对每个会话或进程的日志行号,从 1 开始
%s:进程开始的时间戳
%v:虚拟事务 ID (backendID/localXID)
%x:事务 ID (如果未分配则为 0)
%q:不产生输出,但是告诉非会话进程在字符串的这一点停止;会话进程忽略
%%:纯文字%