支持的版本:当前 (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

19.8. 错误报告和日志 #

19.8.1. 日志记录位置 #

log_destination (string) #

PostgreSQL 支持多种记录服务器消息的方法,包括 stderrcsvlogjsonlogsyslog。在 Windows 上,还支持 eventlog。将此参数设置为以逗号分隔的所需日志目标列表。默认情况下仅记录到 stderr。此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。

如果 csvlog 包含在 log_destination 中,则日志条目以逗号分隔值(CSV) 格式输出,这便于将日志加载到程序中。有关详细信息,请参阅 第 19.8.4 节logging_collector 必须启用才能生成 CSV 格式的日志输出。

如果 jsonlog 包含在 log_destination 中,则日志条目以JSON格式输出,这便于将日志加载到程序中。有关详细信息,请参阅 第 19.8.5 节logging_collector 必须启用才能生成 JSON 格式的日志输出。

当包含 stderrcsvlogjsonlog 时,将创建文件 current_logfiles 以记录日志收集器当前正在使用的日志文件的位置以及关联的日志目标。这提供了一种查找实例当前正在使用的日志的便捷方法。以下是此文件内容的示例

stderr log/postgresql.log
csvlog log/postgresql.csv
jsonlog log/postgresql.json

当由于轮换而创建新日志文件,以及重新加载 log_destination 时,会重新创建 current_logfiles。当 log_destination 中不包含 stderrcsvlogjsonlog,以及禁用日志收集器时,会删除它。

注意

在大多数 Unix 系统上,您需要更改系统的 syslog 守护程序的配置,才能使用 log_destinationsyslog 选项。PostgreSQL 可以记录到 syslog 工具 LOCAL0LOCAL7(请参阅 syslog_facility),但大多数平台上的默认 syslog 配置将丢弃所有此类消息。您需要向 syslog 守护程序的配置文件中添加类似以下的内容才能使其正常工作。

local0.*    /var/log/postgresql

添加到 syslog 守护程序的配置文件中,使其正常工作。

在 Windows 上,当您为 log_destination 使用 eventlog 选项时,您应该向操作系统注册事件源及其库,以便 Windows 事件查看器可以清晰地显示事件日志消息。有关详细信息,请参阅 第 18.12 节

logging_collector (boolean) #

此参数启用日志收集器,这是一个后台进程,用于捕获发送到 stderr 的日志消息并将其重定向到日志文件中。这种方法通常比记录到 syslog 更有效,因为某些类型的消息可能不会出现在 syslog 输出中。(一个常见的例子是动态链接器故障消息;另一个例子是脚本(如 archive_command)产生的错误消息。)此参数只能在服务器启动时设置。

注意

可以在不使用日志收集器的情况下记录到 stderr;日志消息只会发送到服务器的 stderr 指向的位置。但是,该方法仅适用于低日志量,因为它没有提供方便的日志文件轮换方法。此外,在某些平台上,不使用日志收集器可能会导致日志输出丢失或损坏,因为多个进程同时写入同一日志文件可能会覆盖彼此的输出。

注意

日志收集器旨在永不丢失消息。这意味着,在极高的负载情况下,当收集器滞后时,服务器进程可能会在尝试发送其他日志消息时被阻止。相反,syslog 如果无法写入消息,则会选择丢弃消息,这意味着在这种情况下它可能无法记录某些消息,但不会阻止系统的其余部分。

log_directory (string) #

启用 logging_collector 后,此参数确定将在其中创建日志文件的目录。它可以指定为绝对路径,也可以相对于集群数据目录。此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。默认值为 log

log_filename (string) #

启用 logging_collector 后,此参数设置创建的日志文件的文件名。该值被视为 strftime 模式,因此可以使用 % 转义符来指定随时间变化的文件名。(请注意,如果存在任何与时区相关的 % 转义符,则计算是在 log_timezone 指定的时区中完成的。)支持的 % 转义符类似于 Open Group 的 strftime 规范中列出的转义符。请注意,不直接使用系统的 strftime,因此特定于平台(非标准)的扩展不起作用。默认值为 postgresql-%Y-%m-%d_%H%M%S.log

如果指定不带转义符的文件名,则应计划使用日志轮换实用程序,以避免最终填满整个磁盘。在 8.4 之前的版本中,如果没有 % 转义符,PostgreSQL 会附加新日志文件创建时间的纪元,但现在不再是这种情况。

如果在 log_destination 中启用了 CSV 格式的输出,则 .csv 将附加到带时间戳的日志文件名,以创建 CSV 格式输出的文件名。(如果 log_filename.log 结尾,则会替换后缀。)

如果在 log_destination 中启用了 JSON 格式输出,则会在时间戳日志文件名后附加 .json,以创建 JSON 格式输出的文件名。(如果 log_filename.log 结尾,则会替换该后缀。)

此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。

log_file_mode (integer) #

在 Unix 系统上,当启用 logging_collector 时,此参数设置日志文件的权限。(在 Microsoft Windows 上,此参数将被忽略。)参数值应为以 chmodumask 系统调用接受的格式指定的数字模式。(要使用常用的八进制格式,该数字必须以 0 (零) 开头。)

默认权限为 0600,表示只有服务器所有者才能读取或写入日志文件。另一个常用的设置是 0640,允许所有者组的成员读取文件。但是请注意,要使用此类设置,您需要更改 log_directory 以将文件存储在集群数据目录之外的某个位置。无论如何,将日志文件设置为世界可读是不明智的,因为它们可能包含敏感数据。

此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。

log_rotation_age (integer) #

当启用 logging_collector 时,此参数确定使用单个日志文件的最大时间量,超过该时间后将创建一个新的日志文件。如果此值未指定单位,则将其视为分钟。默认值为 24 小时。设置为零以禁用基于时间创建新日志文件。此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。

log_rotation_size (integer) #

当启用 logging_collector 时,此参数确定单个日志文件的最大大小。将此数量的数据写入日志文件后,将创建一个新的日志文件。如果此值未指定单位,则将其视为千字节。默认值为 10 兆字节。设置为零以禁用基于大小创建新日志文件。此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。

log_truncate_on_rotation (boolean) #

当启用 logging_collector 时,此参数将导致 PostgreSQL 截断(覆盖),而不是附加到任何同名的现有日志文件。但是,仅当由于基于时间的轮换而打开新文件时才会发生截断,而不是在服务器启动或基于大小的轮换期间。关闭时,在所有情况下都会附加到预先存在的文件。例如,将此设置与类似 postgresql-%H.loglog_filename 结合使用,将生成二十四个每小时日志文件,然后循环覆盖它们。此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。

示例:要保留 7 天的日志,每天一个日志文件,命名为 server_log.Monserver_log.Tue 等,并自动用本周的日志覆盖上周的日志,请将 log_filename 设置为 server_log.%alog_truncate_on_rotation 设置为 on,并将 log_rotation_age 设置为 1440

示例:要保留 24 小时的日志,每小时一个日志文件,但如果日志文件大小超过 1GB,也会更快地轮换,请将 log_filename 设置为 server_log.%H%Mlog_truncate_on_rotation 设置为 onlog_rotation_age 设置为 60,并将 log_rotation_size 设置为 1000000。在 log_filename 中包含 %M 允许可能发生的任何大小驱动的轮换选择与该小时的初始文件名不同的文件名。

syslog_facility (enum) #

当启用日志记录到 syslog 时,此参数确定要使用的 syslogfacility”。您可以从 LOCAL0LOCAL1LOCAL2LOCAL3LOCAL4LOCAL5LOCAL6LOCAL7 中选择;默认值为 LOCAL0。另请参阅系统 syslog 守护程序的文档。此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。

syslog_ident (string) #

当启用日志记录到 syslog 时,此参数确定用于在 syslog 日志中标识 PostgreSQL 消息的程序名称。默认值为 postgres。此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。

syslog_sequence_numbers (boolean) #

当日志记录到 syslog 且此项设置为 on (默认值) 时,则每个消息将以递增的序列号(例如 [2])为前缀。这规避了许多 syslog 实现默认执行的 “--- 上一条消息重复 N 次 ---” 抑制。在更现代的 syslog 实现中,可以配置重复消息抑制(例如,rsyslog 中的 $RepeatedMsgReduction),因此这可能不是必需的。此外,如果您确实想抑制重复消息,则可以关闭此项。

此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。

syslog_split_messages (boolean) #

当启用日志记录到 syslog 时,此参数确定消息如何传递到 syslog。当设置为 on (默认值) 时,消息将按行拆分,并且长行将被拆分,使其适合 1024 字节,这是传统 syslog 实现的典型大小限制。当关闭时,PostgreSQL 服务器日志消息将按原样传递到 syslog 服务,并且由 syslog 服务来处理可能很大的消息。

如果 syslog 最终记录到文本文件,则无论哪种方式,效果都将相同,最好保持该设置打开,因为大多数 syslog 实现要么无法处理大型消息,要么需要进行特殊配置才能处理它们。但是,如果 syslog 最终写入其他介质,则可能有必要或更有用地将消息在逻辑上保持在一起。

此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。

event_source (string) #

当启用日志记录到 事件日志 时,此参数确定用于在日志中标识 PostgreSQL 消息的程序名称。默认值为 PostgreSQL。此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。

19.8.2. 何时记录 #

log_min_messages (enum) #

控制哪些消息级别写入服务器日志。有效值为 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORLOGFATALPANIC。每个级别都包括其后的所有级别。级别越靠后,发送到日志的消息就越少。默认值为 WARNING。请注意,此处的 LOGclient_min_messages 中的排名不同。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

log_min_error_statement (enum) #

控制哪些导致错误条件的 SQL 语句记录在服务器日志中。当前 SQL 语句包含在指定严重性或更高严重性的任何消息的日志条目中。有效值为 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORLOGFATALPANIC。默认值为 ERROR,这意味着导致错误、日志消息、致命错误或 panic 的语句将被记录。要有效地关闭失败语句的日志记录,请将此参数设置为 PANIC。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

log_min_duration_statement (integer) #

如果语句运行的时间至少为指定的时间量,则导致记录每个已完成语句的持续时间。例如,如果您将其设置为 250ms,则所有运行 250ms 或更长时间的 SQL 语句都将被记录。启用此参数有助于在您的应用程序中追踪未优化的查询。如果此值未指定单位,则将其视为毫秒。将其设置为零会打印所有语句持续时间。-1(默认值)禁用记录语句持续时间。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

这会覆盖 log_min_duration_sample,这意味着持续时间超过此设置的查询不受抽样影响,并且始终会被记录。

对于使用扩展查询协议的客户端,Parse、Bind 和 Execute 步骤的持续时间将独立记录。

注意

当将此选项与 log_statement 一起使用时,由于 log_statement 而记录的语句文本将不会在持续时间日志消息中重复出现。如果您不使用 syslog,建议您使用 log_line_prefix 记录 PID 或会话 ID,以便您可以使用进程 ID 或会话 ID 将语句消息链接到稍后的持续时间消息。

log_min_duration_sample (integer) #

允许对运行时间至少达到指定时长的已完成语句的持续时间进行采样。这将生成与 log_min_duration_statement 相同的日志条目,但仅针对执行语句的一个子集,采样率由 log_statement_sample_rate 控制。例如,如果您将其设置为 100ms,则所有运行时间为 100ms 或更长的 SQL 语句都将被考虑进行采样。当流量过高而无法记录所有查询时,启用此参数可能会很有用。如果此值在没有单位的情况下指定,则将其视为毫秒。将其设置为零将对所有语句持续时间进行采样。-1(默认值)禁用语句持续时间采样。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

此设置的优先级低于 log_min_duration_statement,这意味着持续时间超过 log_min_duration_statement 的语句不受采样的影响,并且始终会被记录。

关于 log_min_duration_statement 的其他注意事项也适用于此设置。

log_statement_sample_rate (floating point) #

确定持续时间超过 log_min_duration_sample 的语句中将被记录的语句的比例。采样是随机的,例如 0.5 表示统计上任何给定语句被记录的机会为二分之一。默认值为 1.0,表示记录所有采样的语句。将其设置为零将禁用采样的语句持续时间日志记录,与将 log_min_duration_sample 设置为 -1 的效果相同。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

log_transaction_sample_rate (floating point) #

设置除了由于其他原因记录的语句外,还会记录其所有语句的事务的比例。它适用于每个新事务,而不管其语句的持续时间如何。采样是随机的,例如 0.1 表示统计上任何给定事务将被记录的机会为十分之一。log_transaction_sample_rate 有助于构造事务样本。默认值为 0,表示不记录任何其他事务的语句。将其设置为 1 会记录所有事务的所有语句。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

注意

像所有语句日志记录选项一样,此选项会增加显著的开销。

log_startup_progress_interval (integer) #

设置启动进程在长时间运行的操作仍在进行时记录消息的时间量,以及该操作的后续进度消息之间的间隔。默认值为 10 秒。设置为 0 将禁用此功能。如果此值在没有单位的情况下指定,则将其视为毫秒。此设置分别应用于每个操作。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

例如,如果同步数据目录需要 25 秒,之后重置未记录的关系需要 8 秒,并且如果此设置的默认值为 10 秒,则在同步数据目录已进行 10 秒后将记录消息,并且在同步数据目录已进行 20 秒后再次记录消息,但不会记录重置未记录关系的消息。

表 19.2 解释了 PostgreSQL 使用的消息严重级别。如果日志输出发送到 syslog 或 Windows 的 eventlog,则严重级别将按表中所示进行转换。

表 19.2. 消息严重级别

严重级别 用法 syslog eventlog
DEBUG1 .. DEBUG5 为开发人员提供越来越详细的信息。 DEBUG INFORMATION
INFO 提供用户隐式请求的信息,例如,VACUUM VERBOSE 的输出。 INFO INFORMATION
NOTICE 提供可能对用户有帮助的信息,例如,截断长标识符的通知。 NOTICE INFORMATION
WARNING 提供可能存在的问题的警告,例如,事务块外的 COMMIT NOTICE WARNING
ERROR 报告导致当前命令中止的错误。 WARNING ERROR
LOG 报告管理员感兴趣的信息,例如,检查点活动。 INFO INFORMATION
FATAL 报告导致当前会话中止的错误。 ERR ERROR
PANIC 报告导致所有数据库会话中止的错误。 CRIT ERROR

19.8.3. 要记录什么 #

注意

您选择记录的内容可能具有安全隐患;请参阅第 24.3 节

application_name (string) #

application_name 可以是少于 NAMEDATALEN 个字符(标准版本中为 64 个字符)的任何字符串。它通常由应用程序在连接到服务器时设置。该名称将显示在 pg_stat_activity 视图中,并包含在 CSV 日志条目中。它也可以通过 log_line_prefix 参数包含在常规日志条目中。 application_name 值中只能使用可打印的 ASCII 字符。其他字符将替换为C 样式十六进制转义

debug_print_parse (boolean)
debug_print_rewritten (boolean)
debug_print_plan (boolean) #

这些参数启用要发出的各种调试输出。设置后,它们会打印每个执行的查询的结果解析树、查询重写器输出或执行计划。这些消息在 LOG 消息级别发出,因此默认情况下,它们将显示在服务器日志中,但不会发送到客户端。您可以通过调整 client_min_messages 和/或 log_min_messages 来更改该设置。默认情况下,这些参数处于关闭状态。

debug_pretty_print (boolean) #

设置后,debug_pretty_print 会缩进 debug_print_parsedebug_print_rewrittendebug_print_plan 生成的消息。与关闭时使用的 紧凑 格式相比,这将产生更易于阅读但长得多的输出。默认情况下处于启用状态。

log_autovacuum_min_duration (integer) #

如果自动清理的每个操作运行的时间至少达到指定量,则会导致记录该操作。将其设置为零将记录所有自动清理操作。-1 禁用自动清理操作的日志记录。如果此值在没有单位的情况下指定,则将其视为毫秒。例如,如果您将其设置为 250ms,则所有运行时间为 250ms 或更长的自动清理和分析都将被记录。此外,当此参数设置为除 -1 以外的任何值时,如果由于冲突的锁或并发删除的关系而跳过自动清理操作,则将记录一条消息。默认值为 10min。启用此参数有助于跟踪自动清理活动。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但是,可以通过更改表存储参数来覆盖单个表的设置。

log_checkpoints (boolean) #

导致检查点和重启点记录在服务器日志中。日志消息中包含一些统计信息,包括写入的缓冲区数量和写入它们所花费的时间。此参数只能在 postgresql.conf 文件或服务器命令行中设置。默认值为 on。

log_connections (boolean) #

导致记录每个尝试连接到服务器的连接,以及成功完成客户端身份验证(如果需要)和授权的连接。只有超级用户和具有适当 SET 权限的用户才能在会话开始时更改此参数,并且在会话中完全无法更改。默认值为 off

注意

某些客户端程序(如 psql)在确定是否需要密码时会尝试连接两次,因此重复的 收到连接 消息并不一定表示存在问题。

log_disconnections (boolean) #

导致记录会话终止。日志输出提供与 log_connections 类似的信息,以及会话的持续时间。只有超级用户和具有适当 SET 权限的用户才能在会话开始时更改此参数,并且在会话中完全无法更改。默认值为 off

log_duration (boolean) #

启用后,将记录每个已完成语句的执行时长。默认值为 off。只有超级用户和具有相应 SET 权限的用户才能更改此设置。

对于使用扩展查询协议的客户端,Parse、Bind 和 Execute 步骤的持续时间将独立记录。

注意

启用 log_duration 和将 log_min_duration_statement 设置为零的区别在于,超过 log_min_duration_statement 会强制记录查询文本,而此选项不会。因此,如果 log_durationonlog_min_duration_statement 具有正值,则会记录所有执行时长,但仅当语句超过阈值时才会包含查询文本。此行为对于在高负载环境中收集统计信息非常有用。

log_error_verbosity (enum) #

控制写入服务器日志的每条消息的详细程度。有效值包括 TERSEDEFAULTVERBOSE,每个值都会向显示的消息添加更多字段。TERSE 排除记录 DETAILHINTQUERYCONTEXT 错误信息。VERBOSE 输出包括 SQLSTATE 错误代码(另请参阅附录 A)以及生成错误的代码源文件名、函数名和行号。只有超级用户和具有相应 SET 权限的用户才能更改此设置。

log_hostname (boolean) #

默认情况下,连接日志消息仅显示连接主机的 IP 地址。启用此参数还会记录主机名。请注意,根据您的主机名解析设置,这可能会带来不可忽略的性能损失。此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。

log_line_prefix (string) #

这是一个 printf 风格的字符串,输出在每行日志的开头。% 字符开始转义序列,这些转义序列会被替换为如下所述的状态信息。无法识别的转义将被忽略。其他字符将直接复制到日志行。某些转义仅能被会话进程识别,会被主服务器进程等后台进程视为空。可以通过在 % 和选项之间指定数字字面值来左对齐或右对齐状态信息。负值将用空格在右侧填充状态信息,使其具有最小宽度,而正值将在左侧填充。填充有助于提高日志文件的人工可读性。

此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。默认值为 '%m [%p] ',它会记录时间戳和进程 ID。

转义 效果 仅限会话
%a 应用程序名称
%u 用户名
%d 数据库名称
%r 远程主机名或 IP 地址以及远程端口
%h 远程主机名或 IP 地址
%b 后端类型
%p 进程 ID
%P 并行组领导者的进程 ID,如果此进程是并行查询工作进程
%t 不含毫秒的时间戳
%m 包含毫秒的时间戳
%n 包含毫秒的时间戳(作为 Unix 时间戳)
%i 命令标签:会话当前命令的类型
%e SQLSTATE 错误代码
%c 会话 ID:见下文
%l 每个会话或进程的日志行号,从 1 开始
%s 进程启动时间戳
%v 虚拟事务 ID(procNumber/localXID);请参阅 第 66.1 节
%x 事务 ID(如果没有分配则为 0);请参阅 第 66.1 节
%q 不产生输出,但告知非会话进程在此字符串中的这一点停止;会被会话进程忽略
%Q 当前查询的查询标识符。默认情况下不计算查询标识符,因此除非启用 compute_query_id 参数或配置了计算查询标识符的第三方模块,否则此字段将为零。
%% 文字 %

后端类型对应于视图 pg_stat_activity 中的列 backend_type,但日志中可能会出现视图中没有的其他类型。

%c 转义打印一个准唯一的会话标识符,由两个以点分隔的 4 字节十六进制数字(不带前导零)组成。这两个数字是进程启动时间和进程 ID,因此 %c 也可以用作打印这些项的节省空间的方式。例如,要从 pg_stat_activity 生成会话标识符,请使用以下查询

SELECT to_hex(trunc(EXTRACT(EPOCH FROM backend_start))::integer) || '.' ||
       to_hex(pid)
FROM pg_stat_activity;

提示

如果为 log_line_prefix 设置了非空值,通常应使其最后一个字符为空格,以便与日志行的其余部分提供视觉分隔。也可以使用标点符号。

提示

Syslog 会生成自己的时间戳和进程 ID 信息,因此如果记录到 syslog,则可能不需要包含这些转义。

提示

当包含仅在会话(后端)上下文中可用的信息(如用户或数据库名称)时,%q 转义非常有用。例如

log_line_prefix = '%m [%p] %q%u@%d/%a '

注意

%Q 转义始终为 log_statement 输出的行报告零标识符,因为 log_statement 在计算标识符之前生成输出,包括无法计算标识符的无效语句。

log_lock_waits (boolean) #

控制当会话等待超过 deadlock_timeout 来获取锁时是否生成日志消息。这对于确定锁等待是否导致性能不佳非常有用。默认值为 off。只有超级用户和具有相应 SET 权限的用户才能更改此设置。

log_recovery_conflict_waits (boolean) #

控制当启动进程等待恢复冲突的时间超过 deadlock_timeout 时是否生成日志消息。这对于确定恢复冲突是否阻止恢复应用 WAL 非常有用。

默认值为 off。此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。

log_parameter_max_length (integer) #

如果大于零,则使用非错误语句日志消息记录的每个绑定参数值都将被截断为此字节数。零会禁用非错误语句日志的绑定参数记录。-1(默认值)允许完全记录绑定参数。如果未指定单位,则此值被视为字节。只有超级用户和具有相应 SET 权限的用户才能更改此设置。

此设置仅影响由 log_statementlog_duration 和相关设置打印的日志消息。此设置的非零值会增加一些开销,特别是当参数以二进制形式发送时,因为此时需要转换为文本。

log_parameter_max_length_on_error (integer) #

如果大于零,则错误消息中报告的每个绑定参数值都将被截断为此字节数。零(默认值)禁用在错误消息中包含绑定参数。-1 允许完全打印绑定参数。如果未指定单位,则此值被视为字节。

此设置的非零值会增加开销,因为 PostgreSQL 需要在每个语句的开头在内存中存储参数值的文本表示形式,无论最终是否发生错误。当绑定参数以二进制形式发送时,开销比以文本形式发送时更大,因为前一种情况需要数据转换,而后者仅需要复制字符串。

log_statement (enum) #

控制记录哪些 SQL 语句。有效值包括 none(关闭)、ddlmodall(所有语句)。ddl 记录所有数据定义语句,如 CREATEALTERDROP 语句。mod 记录所有 ddl 语句,以及数据修改语句,如 INSERTUPDATEDELETETRUNCATECOPY FROMPREPAREEXECUTEEXPLAIN ANALYZE 语句,如果其包含的命令是适当的类型,也会被记录。对于使用扩展查询协议的客户端,当收到 Execute 消息时会进行记录,并且会包含 Bind 参数的值(任何嵌入的单引号都会加倍)。

默认值为 none。只有超级用户和拥有相应 SET 权限的用户才能更改此设置。

注意

即使 log_statement 设置为 all,包含简单语法错误的语句也不会被记录,因为只有在完成基本解析以确定语句类型后才会发出日志消息。对于扩展查询协议,此设置同样不会记录在执行阶段之前失败的语句(即在解析分析或计划期间)。将 log_min_error_statement 设置为 ERROR (或更低)以记录此类语句。

记录的语句可能会泄露敏感数据,甚至包含明文密码。

log_replication_commands (boolean) #

使每个复制命令和 walsender 进程的复制槽获取/释放记录在服务器日志中。有关复制命令的更多信息,请参见 第 53.4 节。默认值为 off。只有超级用户和拥有相应 SET 权限的用户才能更改此设置。

log_temp_files (integer) #

控制临时文件名和大小的日志记录。可以为排序、哈希和临时查询结果创建临时文件。如果此设置启用,则会为每个临时文件发出一个日志条目,并在删除时指定文件大小(以字节为单位)。值为零会记录所有临时文件信息,而正值仅记录大小大于或等于指定数据量的文件。如果此值未指定单位,则将其视为千字节。默认设置为 -1,这会禁用此类日志记录。只有超级用户和拥有相应 SET 权限的用户才能更改此设置。

log_timezone (string) #

设置服务器日志中写入的时间戳所使用的时区。与 TimeZone 不同,此值是集群范围的,因此所有会话都会一致地报告时间戳。内置的默认值为 GMT,但这通常会在 postgresql.conf 中被覆盖;initdb 将在此处安装一个与其系统环境对应的设置。有关更多信息,请参见 第 8.5.3 节。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

19.8.4. 使用 CSV 格式的日志输出 #

log_destination 列表中包含 csvlog 提供了一种方便的方式将日志文件导入到数据库表中。此选项以逗号分隔值 (CSV) 格式发出日志行,其中包含以下列:带有毫秒的时间戳、用户名、数据库名称、进程 ID、客户端主机:端口号、会话 ID、每个会话的行号、命令标签、会话开始时间、虚拟事务 ID、常规事务 ID、错误严重性、SQLSTATE 代码、错误消息、错误消息详细信息、提示、导致错误的内部查询(如果有)、其中错误位置的字符计数、错误上下文、导致错误的用户查询(如果有且由 log_min_error_statement 启用)、其中错误位置的字符计数、错误在 PostgreSQL 源代码中的位置(如果 log_error_verbosity 设置为 verbose)、应用程序名称、后端类型、并行组领导者的进程 ID 和查询 ID。这是一个用于存储 CSV 格式日志输出的示例表定义

CREATE TABLE postgres_log
(
  log_time timestamp(3) with time zone,
  user_name text,
  database_name text,
  process_id integer,
  connection_from text,
  session_id text,
  session_line_num bigint,
  command_tag text,
  session_start_time timestamp with time zone,
  virtual_transaction_id text,
  transaction_id bigint,
  error_severity text,
  sql_state_code text,
  message text,
  detail text,
  hint text,
  internal_query text,
  internal_query_pos integer,
  context text,
  query text,
  query_pos integer,
  location text,
  application_name text,
  backend_type text,
  leader_pid integer,
  query_id bigint,
  PRIMARY KEY (session_id, session_line_num)
);

要将日志文件导入到此表中,请使用 COPY FROM 命令

COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;

也可以使用提供的 file_fdw 模块以外部表的方式访问该文件。

您需要做一些事情来简化导入 CSV 日志文件

  1. 设置 log_filenamelog_rotation_age 以便为您的日志文件提供一致且可预测的命名方案。这使您可以预测文件名,并知道何时完成单个日志文件并因此可以导入。

  2. log_rotation_size 设置为 0 以禁用基于大小的日志轮换,因为它使日志文件名难以预测。

  3. log_truncate_on_rotation 设置为 on,以便旧日志数据不会与同一文件中的新数据混合。

  4. 上面的表定义包含主键规范。这有助于防止意外地两次导入相同的信息。COPY 命令一次性提交其导入的所有数据,因此任何错误都会导致整个导入失败。如果您导入了一个部分日志文件,然后稍后在文件完整时再次导入该文件,则主键冲突将导致导入失败。在导入之前,请等待日志完成并关闭。此过程还将防止意外导入尚未完全写入的部分行,这也将导致 COPY 失败。

19.8.5. 使用 JSON 格式的日志输出 #

log_destination 列表中包含 jsonlog 提供了一种方便的方式将日志文件导入到许多不同的程序中。此选项以JSON格式发出日志行。

具有空值的字符串字段将从输出中排除。将来可能会添加其他字段。处理 jsonlog 输出的用户应用程序应忽略未知字段。

每个日志行都序列化为 JSON 对象,其中包含 表 19.3 中显示的键集合及其关联的值。

表 19.3. JSON 日志条目的键和值

键名 类型 描述
timestamp string 包含毫秒的时间戳
user string 用户名
dbname string 数据库名称
pid number 进程 ID
remote_host string 客户端主机
remote_port number 客户端端口
session_id string 会话 ID
line_num number 每个会话的行号
ps string 当前 ps 显示
session_start string 会话开始时间
vxid string 虚拟事务 ID
txid string 常规事务 ID
error_severity string 错误严重性
state_code string SQLSTATE 代码
message string 错误消息
detail string 错误消息详细信息
hint string 错误消息提示
internal_query string 导致错误的内部查询
internal_position number 内部查询中的光标索引
context string 错误上下文
statement string 客户端提供的查询字符串
cursor_position number 查询字符串中的光标索引
func_name string 错误位置函数名
file_name string 错误位置的文件名
file_line_num number 错误位置的文件行号
application_name string 客户端应用程序名称
backend_type string 后端类型
leader_pid number 活动并行工作线程的领导者的进程 ID
query_id number 查询 ID

19.8.6. 进程标题 #

这些设置控制如何修改服务器进程的进程标题。通常使用诸如 ps 之类的程序或在 Windows 上使用 进程资源管理器来查看进程标题。有关详细信息,请参见 第 27.1 节

cluster_name (string) #

设置一个名称,该名称用于标识此数据库集群(实例)以用于各种目的。集群名称会出现在此集群中所有服务器进程的进程标题中。此外,它是备用连接的默认应用程序名称(请参见 synchronous_standby_names)。

该名称可以是任何小于 NAMEDATALEN 个字符(在标准版本中为 64 个字符)的字符串。只有可打印的 ASCII 字符才能在 cluster_name 值中使用。其他字符将替换为C 样式十六进制转义。如果此参数设置为空字符串 '' (这是默认值),则不会显示任何名称。此参数只能在服务器启动时设置。

update_process_title (boolean) #

启用每次服务器收到新的 SQL 命令时更新进程标题。此设置在大多数平台上默认为 on,但在 Windows 上默认为 off,因为该平台更新进程标题的开销较大。只有超级用户和拥有相应 SET 权限的用户才能更改此设置。

提交更正

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