2024 年 9 月 26 日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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 警报,以及检测许多其他异常情况。

提交更正

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