pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
最好把数据库服务器的日志输出保存到某个地方,而不是简单地把它丢弃到 /dev/null。诊断问题时,日志输出极其宝贵。但是,日志输出往往十分庞大(尤其是在较高调试级别下),因此你不会希望无限期保存它。 你需要对日志文件进行轮转,以便周期性地启用新的日志文件, 并在合理时间后移除旧文件。
如果你只是把 postgres 的 stderr 重定向到一个文件,那么虽然也能得到日志输出,但截断该日志文件的唯一办法是停止并重新启动服务器。 如果你是在开发环境中使用 PostgreSQL,这也许可以接受, 但几乎没有生产服务器会认为这种行为可以接受。
更好的做法是把服务器的stderr输出发送给某种日志轮转程序。有一个内建的日志轮转设施,只需在postgresql.conf中把配置参数logging_collector设置为true即可使用。该程序的控制参数在第 18.7.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 配置文件的文件名开头使用一个 “-” 来禁用同步。)
请注意,上面描述的所有方案都处理了按可配置间隔启动新日志文件的问题, 但它们并不处理删除那些已经没有用处的旧日志文件。你很可能还需要设置一个批处理任务, 定期删除旧日志文件。另一种可能是把轮转程序配置为循环覆盖旧日志文件。
pgFouine是一个进行复杂日志文件分析的外部项目。check_postgres在日志文件中出现重要消息时提供 Nagios 告警,并能检测许多其他异常情况。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。