On this page
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)。然后,只要您想强制SIGHUP
signal 开始写入新的日志文件,就可以向 syslog 守护程序发送SIGHUP
signal。如果要自动执行日志轮换,可以将 logrotate 程序配置为使用 syslog 中的日志文件。
但是,在许多系统上,syslog 并不是非常可靠,特别是对于大型日志消息而言。它可能会在最需要时截断或删除邮件。另外,在 Linux 上,syslog 会将每个消息刷新到磁盘,从而导致性能下降。 (您可以在 syslog 配置文件中的文件名开头使用“ -
”来禁用同步.)
请注意,上述所有解决方案都以可配置的时间间隔启动新的日志文件,但是它们不处理删除旧的,不再有用的日志文件。您可能需要设置一个批处理作业,以定期删除旧的日志文件。另一种可能性是配置循环程序,以便旧日志文件被周期性地覆盖。
pgBadger是一个进行复杂日志文件分析的外部项目。当重要消息出现在日志文件中时,check_postgres会向 Nagios 发出警报,并检测许多其他异常情况。