当前位置:   article > 正文

Postgresql_运行日志包含Error log、Alert log、Slow sql等,运行日志文件过大引发磁盘爆满一般是log_statemen和log_statement_stats这类参数_postgresql 错误日志

postgresql 错误日志

官方文档https://www.postgresql.org/docs/14/runtime-config-logging.html

总结
1、Postgresql运行日志包括慢查询Slow SQL、Error错误\Alert告警、审计信息,数据库的启动关闭等信息,并且都是放在一个日志文件中的(和oracle,sqlserver,mysql不一样),并且这几种日志不互相统属,只要哪种日志参数被设置了就会记录哪种日志,比如同时设置慢日志参数(log_min_duration_statement=10s,超过10秒的语句才会记录)和审计日志参数(log_statement=all,每个语句都会记录),则超过10秒的语句会被记录到运行日志文件中,每个运行的语句也会被记录到运行日志文件中就算该语句运行时间只有0.1秒
2、Postgresql运行日志增长过快过大导致磁盘爆满的原因一般是参数设置不对导致,比如设置log_duration=on、log_statement=all、log_statement_stats=on、log_min_duration_statement=0
3、想让Postgresql运行日志不会被覆盖掉、可以规律切换、单个运行日志文件具有一定的保留期限或大小,则需要合理设置四个参数log_filename、log_truncate_on_rotation、log_rotation_age、log_rotation_size,因为启用log_truncate_on_rotation=on时,log_rotation_age和log_rotation_size两个参数任意一个达到触发条件时都会触发切换运行日志的动作,所以这个时候新的log文件名至关重要,比如保留一年设置log_filename = 'postgresql-%Y-%m-%d.log’这肯定不行,因为-%Y-%m-%d在每年都是独一无二的所以不会被覆盖,保留一年设置成log_filename = 'postgresql-%m-%d.log’就对了,因为%m-%d在每年的值都是一样的,所以设置保留期限是多少,时间格式就是它的下一级单位,保留一天它的下一级单位就是小时就是%H,保留1小时它的下一级单位就是分钟就是%M。实际工作中一般设置log_rotation_size=0禁用基于尺寸的日志轮转,再设置其他三个参数log_filename、log_truncate_on_rotation、log_rotation_age来达到目标。

错误日志涉及的参数
log_min_messages
log_min_error_statement

慢日志涉及的参数
log_min_duration_statement

审计日志涉及的参数
log_lock_waits
log_connections
log_disconnections
log_duration
log_statement
log_statement_stats
log_replication_commands

接到报警,postgresql软件安装目录对应的磁盘空间不足,查看一番发现是log目录下的运行日志巨大,在linux上执行tail -f命令查看运行日志文件内容发现持续不断的出现LOG: QUERY STATISTICS和LOG: statement: select xxx;等语句,查看运行日志相关的参数,发现参数对应值如下,才发现是参数log_statement=all、log_statement_stats=on导致的运行日志巨大

logging_collector=on #启用日志收集器,将stderr和csvlog捕获到日志文件中。

log_destination=stderr #使用stderr方式来记录服务器消息,stderr方式表示把错误消息发送到日志文件中,默认值是stderr

log_directory=log #确定日志文件将被创建到相对于集簇数据目录的一个叫log的相对目录中,默认值是log。

log_filename=postgresql-%a.log #设置被创建的日志文件的文件名,以%a表示星期命名,执行date +%a命令可以看到周几。 默认是postgresql-%Y-%m-%d_%H%M%S.log。

log_truncate_on_rotation=on #表示当日志文件已存在时则覆盖原来的日志,off则表示追加

log_rotation_age=1d #单个日志文件的生存期为1天,1天过去后一个新的日志文件会被创建。如果指定值时没有单位,则以分钟为单位,默认为24小时。

log_rotation_size=0 #单个日志文件的大小,0表示禁用基于尺寸的日志轮转,因为它使得日志文件名难以预测。默认值是10兆字节。

log_lock_waits=off #控制当一个会话等待时间超过deadlock_timeout时是否产生一个日志信息,默认值是off。deadlock_timeout是进行死锁检测之前在一个锁上等待的总时间(以毫秒计)。死锁检测相对昂贵,因此服务器不会在每次等待锁时都运行这个它。我们乐观地假设在生产应用中死锁是不常出现的,并且只在开始检测死锁之前等待一会儿。增加这个值就减少了浪费在无用的死锁检测上的时间,但是减慢了报告真正死锁错误的速度。默认是 1 秒(1s),这可能是实际中你想要的最小值。在一个高负载的服务器上,你可能需要增大它。这个值的理想设置应该超过你通常的事务时间,这样就可以减少在锁释放之前就开始死锁检查的机会。

log_connections=off #不记录连接信息到日志中,默认值是off。

log_disconnections=off #不记录连接断开信息到日志中,默认值是off。

log_checkpoints=off #不记录检查查点和重启点到日志中,默认值是off。

log_replication_commands=off #不记录每一个复制命令到服务器日志中,默认值是off。

log_min_messages=error #只有error错误消息才会被记录到日志文件中,有效值是DEBUG5、DEBUG4、 DEBUG3、DEBUG2、DEBUG1、 INFO、NOTICE、WARNING、 ERROR、LOG、FATAL和 PANIC。每个级别都包括以后的所有级别。级别越靠后,被发送的消息越少。默认值是WARNING。

log_min_error_statement=error #表示导致错误、日志消息、致命错误或恐慌错误的语句将被记录在日志中,有效值是DEBUG5、 DEBUG4、DEBUG3、 DEBUG2、DEBUG1、 INFO、NOTICE、 WARNING、ERROR、 LOG、 FATAL和PANIC。默认值是ERROR。

log_min_duration_statement=10s #执行时间超过10秒的SQL会记录到日志文件,设置为 -1(默认值)将停止记录语句持续时间。日志里面记录格式为类似LOG: duration: 12011.374 ms statement: select pg_sleep(12);

log_duration=off #不记录每条SQL语句执行完成消耗的时间,默认值是off。日志里面记录格式为类似LOG: duration: 1078.812 ms
#log_duration=on和log_min_duration_statement=0之间的区别是,超过log_min_duration_statement强制查询的文本被记录,但这个选项不会。因此,如果log_duration为on并且log_min_duration_statement为正值,所有持续时间都将被记录,但是只有超过阈值的语句才会被记录查询文本。其实就是log_duration=on在日志中的记录结果是类似LOG: duration: 1078.812 ms这样的信息,不像log_min_duration_statement=0在日志中的记录结果是类似LOG: duration: 122.350 ms statement: select pg_sleep(0.1);这样带select pg_sleep(0.1)这部分文本信息。比如两个参数设置成log_duration=on,log_min_duration_statement=2s,执行select pg_sleep(1);会在日志文件中记录成LOG: duration: 1078.812 ms,执行select pg_sleep(3);会在日志文件中记录成LOG: duration: 3003.844 ms statement: select pg_sleep(3);

log_statement=all #记录所有 SQL 语句。有效值是 none (off)、ddl、mod和 all(所有语句)。ddl记录所有数据定义语句,例如CREATE、ALTER和 DROP语句。mod记录所有ddl语句,外加数据修改语句例如INSERT, UPDATE、DELETE、TRUNCATE, 和COPY FROM。 如果PREPARE、EXECUTE和 EXPLAIN ANALYZE包含合适类型的命令,它们也会被记录。默认值是none。日志里面记录格式为类似LOG: statement: select pg_reload_conf();
#log_statement=all和log_min_duration_statement=10s的区别,就算设置超过10秒的语句(log_min_duration_statement=10s)才会被记录,只要开启了log_statement=all,如下只有1秒不到10秒的sql语句也会被记录到运行日志,如下示例
2023-07-17 23:31:19.416 PDT [31900] LOG: statement: select pg_sleep(1);

log_statement_stats=on #对每个查询,向服务器日志里输出相应模块的性能统计,log_statement_stats报告总的语句统计,而其它的log_parser_stats、log_planner_stats、log_executor_stats报告针对每个模块的统计。默认值是off。日志里面记录格式为类似LOG: QUERY STATISTICS
#log_statement_stats=on和log_min_duration_statement=10s的区别,就算设置超过10秒的语句(log_min_duration_statement=10s)才会被记录,只要开启了log_statement_stats=on,如下只有0.2秒不到10秒的sql语句也会被记录到运行日志,如下示例
2023-04-24 13:18:42.903 CST [25603] LOG: QUERY STATISTICS
2023-04-24 13:18:42.903 CST [25603] DETAIL: ! system usage stats:
! 0.000088 s user, 0.000000 s system, 0.000089 s elapsed
! [0.163528 s user, 0.039495 s system total]
! 0/0 [0/0] filesystem blocks in/out
! 0/0 [0/2094] page faults/reclaims, 0 [0] swaps
! 0 [0] signals rcvd, 0/0 [0/0] messages rcvd/sent
! 0/0 [985/1] voluntary/involuntary context switches
2023-04-24 13:18:42.903 CST [25603] STATEMENT: SELECT ab_view_menu.id AS ab_view_menu_id, ab_view_menu.name AS ab_view_menu_name
FROM ab_view_menu
WHERE ab_view_menu.id = 148

设置四个参数log_filename、log_truncate_on_rotation、log_rotation_age、log_rotation_size达到保留运行日志的示例

每天一个文件,保留7天,且每天的文件名带星期值
log_filename=‘postgresql-%a.log’
log_truncate_on_rotation=‘on’
log_rotation_age=1d
log_rotation_size=0

每天一个文件,保留一个月
log_filename = ‘postgresql-%d.log’
log_truncate_on_rotation = on
log_rotation_age = 1day
log_rotation_size = 0

每天一个文件,保留一年
log_filename = ‘postgresql-%m-%d.log’
log_truncate_on_rotation = on
log_rotation_age = 1day
log_rotation_size = 0

每分钟1个文件,保留1小时
log_filename = ‘postgresql-%M.log’
log_truncate_on_rotation = on
log_rotation_age = 1min
log_rotation_size = 0

每小时一个文件,保留一天
log_filename = ‘postgresql-%H.log’
log_truncate_on_rotation = on
log_rotation_age = 1hour
log_rotation_size = 0

每个月一个文件,保留一年
log_filename = ‘postgresql-%m.log’
log_truncate_on_rotation = on
log_rotation_age = 1month
log_rotation_size = 0

每周一个文件,保留一年
log_filename = ‘postgresql-%W.log’
log_truncate_on_rotation = on
log_rotation_age = 1week
log_rotation_size = 0

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/135514?site
推荐阅读
相关标签
  

闽ICP备14008679号