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

postgresql 慢、错误、审计日志文件(csvlog) rotate 配置 (非redo、wal日志)

digoal 2019-07-20
1218

作者

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 - 公益是一辈子的事.

digoal's wechat

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

评论