24.3. 日志文件维护

将数据库服务器的日志输出保存在某处是一个好主意,而不仅仅是通过/dev/null丢弃它。诊断问题时,日志输出非常宝贵。但是,日志输出往往非常庞大(尤其是在较高的调试级别),因此您不希望无限期地保存它。您需要“旋转”日志文件,以便在合理的时间后启动新的日志文件并删除旧的日志文件。

如果仅将postgres的 stderr 定向到文件中,则将有日志输出,但是截断日志文件的唯一方法是停止并重新启动服务器。如果在开发环境中使用 PostgreSQL,这可能是可以接受的,但是很少有生产服务器会认为这种行为可以接受。

更好的方法是将服务器的 stderr 输出发送到某种日志轮换程序。有一个内置的日志轮换工具,您可以通过将postgresql.conf中的配置参数logging_collector设置为true来使用。 Section 19.8.1中描述了该程序的控制参数。您还可以使用这种方法以机器可读的 CSV(逗号分隔值)格式捕获日志数据。

或者,如果您已经在使用其他服务器软件,则可能更喜欢使用外部日志轮换程序。例如,Apache 发行版中包含的 rotatelogs 工具可与 PostgreSQL 一起使用。为此,只需将服务器的 stderr 输出通过管道传输到所需程序。如果使用pg_ctl启动服务器,则 stderr 已经重定向到 stdout,因此只需要管道命令,例如:

pg_ctl start | rotatelogs /var/log/pgsql_log 86400

Management 日志输出的另一种生产级方法是将其发送到 syslog,并让 syslog 处理文件轮换。为此,请将postgresql.conf中的配置参数log_destination设置为syslog(仅记录到 syslog)。然后,只要您想强制SIGHUPsignal 开始写入新的日志文件,就可以向 syslog 守护程序发送SIGHUPsignal。如果要自动执行日志轮换,可以将 logrotate 程序配置为使用 syslog 中的日志文件。

但是,在许多系统上,syslog 并不是非常可靠,特别是对于大型日志消息而言。它可能会在最需要时截断或删除邮件。另外,在 Linux 上,syslog 会将每个消息刷新到磁盘,从而导致性能下降。 (您可以在 syslog 配置文件中的文件名开头使用“ -”来禁用同步.)

请注意,上述所有解决方案都以可配置的时间间隔启动新的日志文件,但是它们不处理删除旧的,不再有用的日志文件。您可能需要设置一个批处理作业,以定期删除旧的日志文件。另一种可能性是配置循环程序,以便旧日志文件被周期性地覆盖。

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