作者
digoal
日期
2019-07-20
标签
PostgreSQL , 日志 , csvlog , rotate , 保留时长
背景
如何配置日志文件的保留时长,如何配置日志文件什么时候切换?
日志配置
```
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
保留一周,每天一个文件,当ROTATE时间周期到达后,重复使用同一个文件前truncate文件内容
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d # 什么时候触发基于时间的rotate。
如果文件达到100MB,切换到下一个文件(如果文件名与当前已有文件名同名,则APPEND,而不会truncate这个文件)
所以以上配置,1天内文件大小可以超过100MB。
log_rotation_size = 100MB # 什么时候触发基于文件大小的rotate。
```
log_truncate_on_rotation设置为on的情况下:
log_rotation_age触发,切文件,如果下一个log文件名的文件已经存在,会先执行文件truncate清数据。
log_rotation_size触发,切文件,如果下一个log文件名的文件已经存在,则append写,不会执行文件truncate清数据。
所以rotate时,新的log文件名至关重要。
如果要配置保留7天,每天写一个文件,其实也是在文件名上下功夫,例如配置为%aAud都是可以的。
通过format控制rotate时,下一个log文件的文件名
postgresql log_filename的格式取自strftime系统调用,支持的如下:
man strftime
digoal@pg11-test-> date +%a
Thu
digoal@pg11-test-> date +%A
Thursday
digoal@pg11-test-> date +%d
18
digoal@pg11-test-> date +%D
04/18/19
digoal@pg11-test-> date +%H
15
年
%Y The year as a decimal number including the century.
月
%m The month as a decimal number (range 01 to 12).
日
%d The day of the month as a decimal number (range 01 to 31).
小时
%H The hour as a decimal number using a 24-hour clock (range 00 to 23).
分钟
%M The minute as a decimal number (range 00 to 59).
秒
%s The number of seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC). (TZ)
%S The second as a decimal number (range 00 to 60). (The range is up to 60 to allow for occasional leap seconds.)
星期几
%a The abbreviated weekday name according to the current locale.
%A The full weekday name according to the current locale.
%u The day of the week as a decimal, range 1 to 7, Monday being 1. See also %w. (SU)
第几周
%W The week number of the current year as a decimal number, range 00 to 53, starting with the first Monday as the first day of week 01.
%U The week number of the current year as a decimal number, range 00 to 53, starting with the first Sunday as the first day of week 01. See also %V and %W.
第几天
%j The day of the year as a decimal number (range 001 to 366).
例子
每分钟1个文件,保留1小时
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%M.log'
log_truncate_on_rotation = on
log_rotation_age = 1min
log_rotation_size = 100MB # 在一个时间切换周期内(1min),可能超过100MB
每小时一个文件,保留一天
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%H.log'
log_truncate_on_rotation = on
log_rotation_age = 1hour
log_rotation_size = 100MB # 在一个时间切换周期内(1hour),可能超过100MB
每天一个文件,保留一个月
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%d.log'
log_truncate_on_rotation = on
log_rotation_age = 1day
log_rotation_size = 100MB # 在一个时间切换周期内(1day),可能超过100MB
每个月一个文件,保留一年
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%m.log'
log_truncate_on_rotation = on
log_rotation_age = 1month
log_rotation_size = 100MB # 在一个时间切换周期内(1mohth),可能超过100MB
每周一个文件,保留一年
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%W.log'
log_truncate_on_rotation = on
log_rotation_age = 1week
log_rotation_size = 100MB # 在一个时间切换周期内(1week),可能超过100MB
每天一个文件,保留一年
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%j.log'
log_truncate_on_rotation = on
log_rotation_age = 1day
log_rotation_size = 100MB # 在一个时间切换周期内(1day),可能超过100MB
或者
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%m-%d.log'
log_truncate_on_rotation = on
log_rotation_age = 1day
log_rotation_size = 100MB # 在一个时间切换周期内(1day),可能超过100MB
更多组合可以根据以上方法来编写参数实现
有什么方法可以保证下一个log文件一定和上一个log文件的文件名不一样,并且所有的log文件是一个固定的范围呢?
例如文件名分布在固定的几个文件中
```
pg-01.log
pg-02.log
...
pg-24.log
```
而且任何原因切换日志(时间,或者文件大小),下一个文件一定和上一个log文件的名字不一样,最好还能有序。
至少目前通过参数无法达到,但是可以改内核来实现。
这么做的好处是:
1、保留的文件个数固定
2、每个文件的大小上限固定
3、文件的名字固定
这样我们就可以使用log fdw,每个文件对应一个foreign table,实现比较高效率的本地日志分析。
参考
《使用SQL查询数据库日志 - file_fdw , csvlog , program , find - 1》
《使用SQL查询数据库日志 - file_fdw , csvlog , program , find - 2》
PostgreSQL 许愿链接
您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.
9.9元购买3个月阿里云RDS PostgreSQL实例
PostgreSQL 解决方案集合
德哥 / digoal's github - 公益是一辈子的事.





