选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.3 已于 2018 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

23.3. 日志文件维护 #

最好把数据库服务器的日志输出保存到某个地方,而不是简单地把它丢弃到 /dev/null。诊断问题时,日志输出极其宝贵。但是,日志输出往往十分庞大(尤其是在较高调试级别下),因此你不会希望无限期保存它。 你需要对日志文件进行轮转,以便周期性地启用新的日志文件, 并在合理时间后移除旧文件。

如果你只是把 postgresstderr 重定向到一个文件,那么虽然也能得到日志输出,但截断该日志文件的唯一办法是停止并重新启动服务器。 如果你是在开发环境中使用 PostgreSQL,这也许可以接受, 但几乎没有生产服务器会认为这种行为可以接受。

更好的办法是把服务器的 stderr 输出发送给某种日志轮转程序。 系统内置了日志轮转功能,你可以在 postgresql.conf 中将配置参数 logging_collector 设为 true 来使用它。该程序的控制参数见 第 18.8.1 节。你还可以用这种方式以机器可读的 CSV(逗号分隔值)格式捕获日志数据。

也可以使用外部日志轮转程序,特别是已经在其他服务器软件上使用了某个此类程序时。例如,rotatelogs 工具包含在 Apache 发行版中,也可用于 PostgreSQL。为此,只需通过管道将服务器的 stderr 输出传递给所需程序。如果使用 pg_ctl 启动服务器,那么 stderr 已经被重定向到 stdout,因此只需一个管道命令,例如:

pg_ctl start | rotatelogs /var/log/pgsql_log 86400

管理日志输出的另一种生产级方法,是把它发送给 syslog, 并让 syslog 负责文件轮转。为此,在 postgresql.conf 中把配置参数 log_destination 设为 syslog(如果只想记录到 syslog)。 之后,每当你想强制它开始写入新的日志文件时,都可以向 syslog 守护进程发送一个 SIGHUP 信号。 如果你想自动化日志轮转,也可以把 logrotate 配置为处理来自 syslog 的日志文件。

不过,在很多系统上,syslog 并不十分可靠, 尤其是在日志消息很大时;它可能恰恰在你最需要消息的时候截断或丢弃它们。 此外,在 Linux 上, syslog 会把每条消息都刷盘,导致性能较差。 (你可以在 syslog 配置文件的文件名开头使用一个 - 来禁用同步。)

请注意,上面描述的所有方案都处理了按可配置间隔启动新日志文件的问题, 但它们并不处理删除那些已经没有用处的旧日志文件。你很可能还需要设置一个批处理任务, 定期删除旧日志文件。另一种可能是把轮转程序配置为循环覆盖旧日志文件。

pgBadger 是一个进行复杂日志文件分析的外部项目。 check_postgres 可以在日志文件中出现重要消息时向 Nagios 发出警报,也能检测许多其他异常情况。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。