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

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

current_logfiles 在创建新的日志文件(作为轮换的结果)以及在重新加载 log_destination 时被重新创建。当 log_destination 中不包含 stderrcsvlogjsonlog 中的任何一个,以及在禁用日志收集器时,它将被删除。

注意

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

local0.*    /var/log/postgresql

syslog 守护程序的配置文件以使其工作。

在 Windows 上,当您使用 log_destinationeventlog 选项时,您应该向操作系统注册事件源及其库,以便 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 截断(覆盖)而不是追加到任何同名现有日志文件。但是,截断只会在由于基于时间的轮换而打开新文件时发生,在服务器启动或基于大小的轮换期间不会发生。关闭时,在所有情况下都将追加到预先存在的文件。例如,将此设置与 log_filename 类似 postgresql-%H.log 一起使用将导致生成 24 个小时的日志文件,然后循环覆盖它们。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

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

例如:要保留 24 小时的日志,每小时一个日志文件,但如果日志文件大小超过 1GB,则提前轮换,请将 log_filename 设置为 server_log.%H%Mlog_truncate_on_rotation 设置为 onlog_rotation_age 设置为 60log_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 并且此项启用(默认)时,每个消息将以递增的序列号(例如 [2])为前缀。这通过了许多 syslog 实现默认执行的 --- last message repeated N times --- 抑制。在更现代的 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,那么所有运行 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,则所有运行时间为 100 毫秒或更长的 SQL 语句都将被视为采样对象。当流量过高而无法记录所有查询时,启用此参数可能会有所帮助。如果在不带单位的情况下指定此值,则将其视为毫秒。将其设置为零将对所有语句持续时间进行采样。-1(默认值)禁用对语句持续时间的采样。只有超级用户和具有适当的SET权限的用户才能更改此设置。

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

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

log_statement_sample_rate (浮点数) #

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

log_transaction_sample_rate (浮点数) #

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

注意

与所有语句记录选项一样,此选项可能会增加大量开销。

log_startup_progress_interval (整数) #

设置启动过程将在长时间运行的操作仍在进行中时记录有关该操作的消息的时间间隔,以及该操作的后续进度消息之间的时间间隔。默认值为 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 (字符串) #

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

debug_print_parse (布尔值)
debug_print_rewritten (布尔值)
debug_print_plan (布尔值) #

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

debug_pretty_print (布尔值) #

设置后,debug_pretty_print将缩进debug_print_parsedebug_print_rewrittendebug_print_plan产生的消息。这会导致更易读,但比关闭时的紧凑格式长得多。它默认情况下处于打开状态。

log_autovacuum_min_duration (整数) #

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

log_checkpoints (布尔值) #

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

log_connections (布尔值) #

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

注意

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

log_disconnections (布尔值) #

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

log_duration (布尔值) #

导致每个已完成语句的持续时间记录在日志中。默认值为off。只有超级用户和具有适当的SET权限的用户才能更改此设置。

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

注意

启用log_duration和将log_min_duration_statement设置为零之间的区别在于,超过log_min_duration_statement会强制记录查询的文本,而此选项不会。因此,如果log_durationon,而log_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 消息时发生,并且将包括绑定参数的值(带有任何嵌入的单引号)。

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

注意

包含简单语法错误的语句即使在 log_statement = all 设置下也不会被记录,因为日志消息仅在完成基本解析以确定语句类型后才发出。对于扩展查询协议,此设置同样不会记录在 Execute 阶段之前失败的语句(即,在解析分析或计划期间失败的语句)。将 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 上使用 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 权限的用户才能更改此设置。

提交更正

如果您在文档中发现任何错误,不符合您对特定功能的体验,或者需要进一步澄清,请使用 此表格 报告文档问题。