2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 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 节。要生成 CSV 格式的日志输出,必须启用 logging_collector

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

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

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

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

注意

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

local0.*    /var/log/postgresql

以使其工作。

在 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 会附加新日志文件创建时间的 epoch,但现在已不再是这种情况。

如果在 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 截断(覆盖)同名的现有日志文件,而不是追加。但是,只有在由于基于时间的轮换而打开新文件时才会发生截断,在服务器启动或基于大小的轮换时不会。当禁用时,所有情况都会追加到预先存在的日志文件中。例如,使用此设置并结合 log_filenamepostgresql-%H.log,将生成 24 个小时日志文件,然后循环覆盖它们。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

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

示例:要保留 24 小时的日志,每小时一个日志文件,但如果日志文件大小超过 1GB,则会提前轮换,请将 log_filename 设置为 server_log.%H%M,将 log_truncate_on_rotation 设置为 on,将 log_rotation_age 设置为 60,并将 log_rotation_size 设置为 1000000。在 log_filename 中包含 %M 允许任何由大小驱动的轮换选择一个与该小时初始日志文件名不同的文件名。

syslog_facility (enum) #

当启用了记录到 syslog 时,此参数决定使用的 syslog facility。您可以选择 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。当启用(默认值)时,消息按行分割,长行会被分割以适应 1024 字节,这是传统 syslog 实现的典型大小限制。当禁用时,PostgreSQL 服务器日志消息按原样传递给 syslog 服务,由 syslog 服务来处理可能存在的超大消息。

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

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

event_source (string) #

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

19.8.2. 何时记录 #

log_min_messages (enum) #

控制哪些 消息级别 被写入服务器日志。有效值包括 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORLOGFATALPANIC。每个级别都包含其后的所有级别。级别越靠后,发送到日志的消息就越少。默认是 WARNING。请注意,LOG 在此处的优先级与 client_min_messages 不同。只有超级用户和具有相应 SET 权限的用户才能更改此设置。

log_min_error_statement (enum) #

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

log_min_duration_statement (integer) #

当语句的持续时间至少为指定的量时,记录每个已完成语句的持续时间。例如,如果将其设置为 250ms,则所有运行时间超过 250 毫秒的 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,则所有运行时间超过 100 毫秒的 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) #

当 autovacuum 执行的每个操作运行时间至少为指定的量时,会记录该操作。设置为零会记录所有 autovacuum 操作。-1 会禁用记录 autovacuum 操作。如果此值未指定单位,则假定为毫秒。例如,如果将其设置为 250ms,则所有运行时间超过 250 毫秒的自动 vacuum 和 analyze 操作都将被记录。此外,当此参数设置为除 -1 以外的任何值时,如果 autovacuum 操作因冲突锁或并发删除的表而被跳过,将记录一条消息。默认是 10min。启用此参数有助于跟踪 autovacuum 活动。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但可以通过更改表存储参数为单个表覆盖此设置。

log_checkpoints (boolean) #

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

log_connections (string) #

导致记录服务器的每次连接的各个方面。默认是空字符串 '',这会禁用所有连接日志记录。可以单独或以逗号分隔的列表指定以下选项:

表 19.3. 连接日志选项

名称 描述
receipt 记录连接的接收。
authentication 记录身份验证方法用于标识用户的原始身份。在大多数情况下,身份字符串与 PostgreSQL 用户名匹配,但某些第三方身份验证方法可能会在服务器存储之前更改原始用户标识符。失败的身份验证始终会被记录,无论此设置的值如何。
authorization 记录授权成功的完成。此时连接已建立,但后端尚未完全设置。日志消息包括授权的用户名以及数据库名称和应用程序名称(如果适用)。
setup_durations 记录建立连接和设置后端直到连接准备好执行第一个查询所花费的时间。日志消息包括三个持续时间:总设置持续时间(从 postmaster 接受传入连接开始,到连接准备好执行查询为止)、分叉新后端的耗时以及用户身份验证的耗时。
all 一个方便的别名,相当于指定所有选项。如果 all 在其他选项列表中指定,则会记录所有连接方面。

断开连接的日志记录由 log_disconnections 单独控制。

为了向后兼容,onofftruefalseyesno10 仍然受支持。正值等同于指定 receiptauthenticationauthorization 选项。

只有超级用户和具有相应 SET 权限的用户可以在会话开始时更改此参数,并且不能在会话内更改。

注意

某些客户端程序,例如 psql,在确定是否需要密码时会尝试连接两次,因此重复的“connection received”消息不一定表示有问题。

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 地址
%L 本地地址(客户端连接到的服务器上的 IP 地址)
%b 后端类型
%p 进程 ID
%P 并行组的 leader 进程 ID,如果该进程是并行查询工作进程。
%t 不带毫秒的时间戳
%m 带毫秒的时间戳
%n 带毫秒的时间戳(作为 Unix epoch)
%i 命令标签:当前会话命令的类型
%e SQLSTATE 错误代码
%c 会话 ID:见下文
%l 每个会话或进程的日志行号,从 1 开始
%s 进程启动时间戳
%v 虚拟事务 ID (procNumber/localXID);参见 第 67.1 节
%x 事务 ID(如果没有分配则为 0);参见 第 67.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_lock_failures (boolean) #

控制当锁获取失败时是否生成详细的日志消息。这对于分析锁失败的原因很有用。目前,仅支持由于 SELECT NOWAIT 导致的锁失败。默认是 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 FROM。如果包含的命令类型合适,PREPAREEXECUTEEXPLAIN ANALYZE 语句也会被记录。对于使用扩展查询协议的客户端,记录发生在收到 Execute 消息时,并且会包含 Bind 参数的值(嵌入的单引号将被加倍)。

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

注意

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

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

log_replication_commands (boolean) #

导致在服务器日志中记录每个复制命令以及 walsender 进程的复制槽获取/释放。有关复制命令的更多信息,请参见 第 54.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 格式的日志输出 #

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

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

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

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

表 19.4. 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 活动并行工作进程的 leader 进程 ID
query_id number 查询 ID

19.8.6. 进程标题 #

这些设置控制服务器进程的进程标题如何被修改。进程标题通常使用 ps 等程序查看,或在 Windows 上使用 Process Explorer 查看。有关详细信息,请参见 第 27.1 节

cluster_name (string) #

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

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

update_process_title (boolean) #

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

提交更正

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