支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

24.3. 日志文件维护 #

最好将数据库服务器的日志输出保存到某个地方,而不是通过 /dev/null 直接丢弃。日志输出对于诊断问题非常宝贵。

注意

服务器日志可能包含敏感信息,需要加以保护,无论其存储方式、存储位置或路由目的地如何。例如,某些 DDL 语句可能包含明文密码或其他身份验证详细信息。在 ERROR 级别的已记录语句可能会显示应用程序的 SQL 源代码,并且还可能包含数据行的某些部分。记录数据、事件和相关信息是此功能的预期功能,因此这不是泄漏或错误。请确保服务器日志仅对经过适当授权的人员可见。

日志输出往往是大量的(尤其是在较高的调试级别下),因此您不会想无限期地保存它。您需要轮换日志文件,以便在合理的时间段后启动新的日志文件并删除旧的日志文件。

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

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

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

pg_ctl start | rotatelogs /var/log/pgsql_log 86400

您可以将这些方法结合起来,设置 logrotate 来收集由 PostgreSQL 内置日志收集器生成的日志文件。在这种情况下,日志收集器定义日志文件的名称和位置,而 logrotate 定期归档这些文件。在启动日志轮换时,logrotate 必须确保应用程序将进一步的输出发送到新文件。这通常是通过 postrotate 脚本完成的,该脚本向应用程序发送 SIGHUP 信号,然后应用程序重新打开日志文件。在 PostgreSQL 中,您可以运行带有 logrotate 选项的 pg_ctl。当服务器收到此命令时,服务器将切换到新的日志文件或重新打开现有文件,具体取决于日志配置(请参阅第 19.8.1 节)。

注意

当使用静态日志文件名时,如果达到最大打开文件限制或发生文件表溢出,服务器可能无法重新打开日志文件。在这种情况下,日志消息将被发送到旧的日志文件,直到成功进行日志轮换。如果将 logrotate 配置为压缩日志文件并将其删除,则服务器可能会丢失在此时间范围内记录的消息。为了避免此问题,您可以配置日志收集器以动态分配日志文件名,并使用 prerotate 脚本来忽略打开的日志文件。

另一种管理日志输出的生产级方法是将其发送到 syslog,并让 syslog 处理文件轮换。为此,请在 postgresql.conf 中将配置参数 log_destination 设置为 syslog (仅记录到 syslog)。然后,您可以随时向 syslog 守护进程发送 SIGHUP 信号,以强制它开始写入新的日志文件。如果要自动化日志轮换,可以将 logrotate 程序配置为与来自 syslog 的日志文件一起工作。

但是,在许多系统上,syslog 的可靠性不高,尤其是在处理大型日志消息时;它可能会在您最需要它们时截断或丢弃消息。此外,在 Linux 上,syslog 会将每条消息刷新到磁盘,从而导致性能不佳。(您可以在 syslog 配置文件中使用文件名开头的 - 来禁用同步。)

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

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

提交更正

如果您发现文档中的任何内容不正确,与您使用特定功能的体验不符或需要进一步澄清,请使用此表单报告文档问题。