Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

19.8。错误报告和日志记录 #

19.8.1。在哪里打印日志
19.8.2。何时打印日志
19.8.3。打印什么日志
19.8.4. 使用 CSV 格式的日志输出
19.8.5. 使用 JSON 格式的日志输出
19.8.6. 进程标题

19.8.1. 日志记录位置 #

log_destination (string) #

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

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

如果在 log_destination 中包含 jsonlog,则日志条目将输出为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 配置会丢弃这些消息。您需要添加类似

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 指定的区域中完成。)受支持的 % 转义与开放小组的 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 MB。设为零可禁用基于大小的创建新日志文件。此参数只能在 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.%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 记录日志且该项开启(默认状态)时,每条消息前面都会加上一个不断增长的序列号(例如 [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) #

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

19.8.2. # 何时记录日志

log_min_messages (enum) #

控制哪些消息级别被写入服务器日志。有效值有 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORLOGFATALPANIC。每个级别包含其后的所有级别。级别越低,发送到日志的消息就越少。默认值为 WARNING。请注意,LOG 在这里的排名与在 client_min_messages 中的排名不同。只有超级用户和特权 SET 适当的用户才能更改此设置。

log_min_error_statement (枚举) #

控制记录在服务器日志中的导致错误条件的 SQL 语句。对于指定的严重性或更高的任何消息,当前的 SQL 语句都包含在日志条目中。有效值有 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORLOGFATALPANIC。默认值为 ERROR, 也就是说,将记录导致错误、日志消息、致命错误或崩溃的语句。要有效关闭失败语句的记录,请将此参数设置为 PANIC。只有超级用户和特权 SET 适当的用户才能更改此设置。

log_min_duration_statement (整数) #

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

该值覆盖log_min_duration_sample,意思是在超出此设置的 duration 的情况下查询不受采样约束,且始终被记录。

对于使用扩展查询协议的客户端,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,意味着记录所有采样语句。将此值设置为 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 (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 文件或服务器命令行中设置。默认情况下,开启此功能。

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_durationon,且 log_min_duration_statement 为正值,则会记录所有持续时间,但仅会为超过该阈值的语句包含查询文本。此行为对于收集高负载安装中的统计数据非常有用。

log_error_verbosity (enum) #

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

log_hostname (布尔值) #

默认情况下,连接日志消息只显示连接主机的 IP 地址。打开此参数将同时记录主机名。请注意,根据你的主机名解析设置,这可能造成不可忽略的性能开销。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

log_line_prefix (字符串) #

这是一个 printf 风格的字符串,在每行日志的开头输出。 % 字符开头的 转义序列 会替换为下文所述的状态信息。不识别的转义字符会被忽略。其他字符会被直接复制到日志行中。有些转义字符仅被会话进程识别,且会被后台进程(例如主服务器进程)视为为空。状态信息可以通过在 % 后、选项前指定一个数字字面量来左对齐或右对齐。负值会导致状态信息用空格在右端填充以形成最小宽度,而正值会在左端填充。填充有助于提高日志文件的可读性。

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

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

后端类型对应于视图 pg_stat_activity 中的 backend_type 列,但在日志中还会显示不会在该视图中显示的附加类型。

%c 转义符用于打印准唯一的会话标识,由两个 4 字节十六进制数(没有前导零)用一个点分隔组成。这些数字是进程启动时间和进程标识,所以 %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 会生成自己的时间戳和进程标识信息,如果您正在记录到 syslog 中,则可能不想包含这些转义符。

提示

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

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

注意

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

log_lock_waits (布尔值) #

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

log_recovery_conflict_waits (布尔值) #

控制当启动进程等待恢复冲突超过 deadlock_timeout 时是否产生日志消息。这对于判断恢复冲突是否阻止恢复应用 WAL 很有效。

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

log_parameter_max_length (整数) #

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

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

log_parameter_max_length_on_error (整数) #

如果大于零,每个在错误消息中报告的绑定参数值都会被截断为这么多字节。零(默认值)会禁用在错误信息中包含绑定参数。-1 允许以完整形式打印绑定参数。如果未指定此值所对应的单位,它将被视为字节。

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

log_statement (enum) #

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

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

注意

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

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

log_replication_commands (boolean) #

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

log_temp_files (integer) #

控制临时文件名和大小的日志记录。可以为排序、哈希和临时查询结果创建临时文件。如果通过此设置启用,在删除每个临时文件时会发出一个日志条目,其中文件大小以字节指定。值 0 会记录所有临时文件信息,而正值仅记录大小大于或等于指定数据量大小的文件。如果未指定带有单位的该值,则将其视为千字节。默认设置为 -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 字符串 带毫秒的时间戳
user 字符串 用户名
dbname 字符串 数据库名称
pid 数字 进程标识
remote_host 字符串 客户端主机
remote_port 数字 客户端端口
session_id 字符串 会话 ID
line_num 数字 每会话的行号
ps 字符串 当前 ps 显示
session_start 字符串 会话开始时间
vxid 字符串 虚拟事务 ID
txid 字符串 常规事务 ID
error_severity 字符串 错误严重性
state_code 字符串 SQLSTATE 代码
message 字符串 错误消息
detail 字符串 错误消息详细信息
hint 字符串 错误消息提示
internal_query 字符串 导致错误的内部查询
internal_position 数字 内部查询中的光标索引
context 字符串 错误上下文
statement 字符串 客户端提供的查询字符串
cursor_position 数字 查询字符串中的光标索引
func_name 字符串 错误位置函数名称
file_name 字符串 错误位置的文件名
file_line_num 数字 错误位置的文件行号
application_name 字符串 客户端应用程序名称
backend_type 字符串 后端类型
leader_pid 数字 活动并行工作人员领导者的进程 ID
query_id 数字 查询 ID

19.8.6 进程标题 #

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

cluster_name (字符串) #

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

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

update_process_title (boolean) #

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