Postgresql 中文操作指南

20.8. Error Reporting and Logging #

20.8.1. Where to Log #

  • log_destination (string) #

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

    • 如果 log_destination 中包含 csvlog,则会以“逗号分隔值”(CSV)格式输出日志条目,这便于将日志加载到程序中。有关详细信息,请参见 Section 20.8.4。要生成 CSV 格式的日志输出,必须启用 logging_collector

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

    • 当包含 stderr、csvlog 或 jsonlog 时,会创建文件 current_logfiles 以记录当前由日志收集器使用的日志文件的位置以及关联的日志目标位置。这提供了一种方便的方法来查找实例当前使用的日志。下面是此文件内容的一个示例:

stderr log/postgresql.log
csvlog log/postgresql.csv
jsonlog log/postgresql.json
  • current_logfiles 在因轮转生成新日志文件而重新生成时,以及重新加载 log_destination 时。在 log_destination 中不包含 stderr、csvlog 或 jsonlog 时将其移除,并在禁用日志收集器时将其移除。

    • logging_collector (boolean) #

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

    • 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.%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 。将 %M 包含在 log_filename 中允许可能发生的所有大小驱动的轮换选择一个不同于小时初始文件名的文件名。

    • syslog_facility (enum) #

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

    • syslog_ident (string) #

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

    • syslog_sequence_numbers (boolean) #

  • 当登录到 syslog 并且此项处于启用状态(默认状态)时,每条消息都将以一个递增序列号(例如 [2])作为前缀。这可以规避许多 syslog 实现默认执行的“--- 最后一条消息重复 N 次 ---”抑制。在较新的 syslog 实现中,可以配置重复消息抑制(例如,在 rsyslog 中配置 $RepeatedMsgReduction),因此可能不需要这样做。此外,如果您确实要抑制重复消息,则可以关闭此功能。

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

    • syslog_split_messages (boolean) #

  • 当启用记录到 syslog 时,该参数确定如何将消息传递到 syslog。打开后(默认),消息将按行拆分,并且长行将拆分,以适合典型传统 syslog 实施的 1024 字节的大小限制。关闭后,PostgreSQL 服务器日志消息将按原样传递到 syslog 服务,并且 syslog 服务将负责处理可能笨重的消息。

  • 如果 syslog 最终记录到文本文件中,那么无论哪种方式效果都相同,并且最好保持设置打开,因为大多数 syslog 实施要么无法处理大消息,要么需要经过特殊配置才能处理大消息。但是,如果 syslog 最终写入其他介质,则可能需要或更有效地将消息逻辑地组合在一起。

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

    • event_source (string) #

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

Note

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

local0.*    /var/log/postgresql

在 syslog 守护程序的配置文件中使用它以使其正常工作。

在 Windows 系统中,当为 log_destination 使用 eventlog 选项时,应为操作系统注册事件源及其库,以便 Windows 事件查看器可以清楚地显示事件日志消息。有关详细信息,请参见 Section 19.12

Note

可以记录到 stderr,而不使用日志收集器;日志消息只会发送到服务器 stderr 被导向的任何位置。但是,此方法仅适用于低日志容量,因为它不提供任何方便的方式来轮换日志文件。此外,在某些平台上,不使用日志收集器会导致日志输出丢失或混乱,因为并发写入同一日志文件的多个进程可以互相覆盖它们的输出。

Note

日志收集器被设计为绝不会丢失消息。这意味着,在负载极高的情况下,当收集器落后时,服务器进程可能会在尝试发送其他日志消息时被阻塞。相比之下,syslog 更喜欢在无法写入消息时放弃消息,这意味着它在这样的情况下可能会无法记录某些消息,但不会阻塞系统中的其他部分。

20.8.2. When to Log #

  • log_min_messages (enum) #

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

  • log_min_error_statement (enum) #

    • 控制记录在服务器日志中的、会引发错误条件的 SQL 语句。当前 SQL 语句会包含在指定 severity 或更高级别的任何消息的日志条目中。有效的值包括 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORLOGFATAL_和 _PANIC。默认值为 ERROR,这意味着将记录导致错误、日志消息、致命错误或恐慌的语句。要有效地关闭故障语句的记录,请将此参数设置为 PANIC。只有超级用户和具有相应 SET 权限的用户才能更改此设置。

  • log_min_duration_statement (integer) #

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

    • 这将覆盖 log_min_duration_sample,这意味着持续时间超出此设置的查询不受采样的约束,并始终被记录。

    • 对于使用扩展查询协议的客户端,解析、绑定和执行步骤的持续时间被独立记录。

  • 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/2 的机会将给定语句记录下来。默认值为 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) #

    • 设置在启动过程记录一条关于仍在进行的长时间运行操作的 message 以及此操作的后续进度 message 之间的间隔后所需的时间量。默认值为 10 秒。设置 0 将禁用此功能。如果未提供单位,则此值将以毫秒为单位。此设置单独应用于每个操作。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

    • 例如,如果同步 data 目录需要 25 秒,之后重置未记录关系需要 8 秒,并且此设置的默认值为 10 秒,那么在同步 data 目录进行 10 秒后将记录一条消息,在进行 20 秒后再次记录一条,但不会记录重置未记录关系的任何内容。

Note

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

Note

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

Table 20.2 说明了 PostgreSQL 使用的消息严重性级别。如果将日志输出发送至 syslog 或 Windows 的事件日志,则严重性级别将按照表中所示进行转换。

Table 20.2. Message Severity Levels

Severity

Usage

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

20.8.3. What to Log #

Note

您选择记录的内容可能具有安全影响;请参见 Section 25.3

  • application_name (string) #

    • application_name 可以是少于 NAMEDATALEN 个字符(在标准版本中为 64 个字符)的任意字符串。它通常由应用程序在连接到服务器时设置。此名称将显示在 pg_stat_activity 视图中,并包含在 CSV 日志条目中。它还可以通过 log_line_prefix 参数包含在常规日志条目中。application_name 值中只能使用可打印的 ASCII 字符。其他字符将替换为 C-style hexadecimal escapes

  • 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 和分析都将被记录。此外,当此参数被设置为 -1 以外的任何值时,如果 autovacuum 操作由于存在冲突锁或同时删除关系而被跳过,则将记录一条消息。默认值是 10min。启用此参数有助于跟踪 autovacuum 活动。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但可以更改表存储参数来覆盖各个表的设置。

  • log_checkpoints (boolean) #

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

  • log_connections (boolean) #

    • 导致每次尝试服务器连接的事件和客户端认证的成功完成(如果需要)以及授权都会记录,只有超级用户和具有适当 SET 权限的用户可以在会话开始时更改此参数,并且在会话内无法更改。默认值是 off

  • log_disconnections (boolean) #

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

  • log_duration (boolean) #

    • 导致每个已完成语句的持续时间记录。默认值是 off。只有超级用户和具有适当 SET 权限的用户可以更改此设置。

    • 对于使用扩展查询协议的客户端,解析、绑定和执行步骤的持续时间被独立记录。

  • log_error_verbosity (enum) #

    • 控制为每个记录的消息在服务器日志中写入的详细信息量。有效的值包括 TERSEDEFAULT_和 _VERBOSE,每个值都会向显示的消息中添加更多字段。TERSE 不记录 DETAILHINTQUERY_和 _CONTEXT 错误信息。VERBOSE 输出包括 SQLSTATE 错误代码(另请参见 Appendix A)以及生成错误的源代码文件名、函数名和行号。只有超级用户和具有相应 SET 权限的用户才能更改此设置。

  • log_hostname (boolean) #

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

  • log_line_prefix (string) #

    • 这是一种 printf 风格的字符串,它输出在每一行日志的开头。% 字符开始“转义序列”,它将替换为如下列出的状态信息。无法识别的转义将被忽略。其他字符直接复制到日志行。有些转义只有会话进程可以识别,并且会被后台进程视为为空,例如主服务器进程。状态信息可以通过在 % 和选项之前指定数字文字来向左或向右对齐。负值会导致状态信息在右边填空以赋予其最小宽度,而正值会导致在左边填空。填充有助于提高日志文件的可读性。

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

    • 后端类型对应于视图 pg_stat_activity 中的 column backend_type ,但 additional types 可能出现在日志中,而未显示在该视图中。

    • %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_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 FROM。如果 PREPAREEXECUTEEXPLAIN ANALYZE 语句包含的命令类型合适,也会被记录。对于使用扩展查询协议的客户端,当接收到一个 Execute 消息和 Bind 参数值时会进行记录(随附任何嵌入的单引号加倍)。

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

  • log_replication_commands (boolean) #

    • 导致每条复制命令记录在服务器日志中。有关复制命令的更多信息,请参阅 Section 55.4。默认值为 off。只有超级用户和具有适当 _SET_权限的用户可以更改此设置。

  • log_temp_files (integer) #

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

  • log_timezone (string) #

    • 设置用于在服务器日志中编写的时戳的时间区域。与 TimeZone不同,此值是群集范围的,以便所有会话将一致地报告时间戳。内置默认值为 GMT,但通常在 _postgresql.conf_中被覆盖;initdb 将在其中安装一个与其系统环境相对应的设置。有关更多信息,请参阅 Section 8.5.3。此参数只能在 _postgresql.conf_文件中或服务器命令行上设置。

Note

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

Note

启用 log_duration 和将 log_min_duration_statement 设置为零之间的区别在于,超过 log_min_duration_statement 会强制记录查询文本,但此选项不会。因此,如果 log_durationon 并且 log_min_duration_statement 为正值,将记录所有持续时间,但仅针对超过阈值的语句包含查询文本。这种行为可用于收集高负载安装中的统计信息。

Tip

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

Tip

Syslog 产生自己的时间戳和进程 ID 信息,因此如果您正在记录到 syslog 中,则可能不想包含这些转义。

Tip

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

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

Note

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

Note

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

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

20.8.4. Using CSV-Format Log Output #

csvlog 包括到 log_destination 列表中提供了一种将日志文件导入到数据库表中的便利方式。此选项以逗号分隔值 (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 日志文件的导入,您需要执行以下几个操作:

20.8.5. Using JSON-Format Log Output #

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

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

每行日志都序列化为一个 JSON 对象,其键及其关联的值集如图 Table 20.3所示。

Table 20.3. Keys and Values of JSON Log Entries

Key name

Type

Description

timestamp

string

Time stamp with milliseconds

user

string

User name

dbname

string

Database name

pid

number

Process ID

remote_host

string

Client host

remote_port

number

Client port

session_id

string

Session ID

line_num

number

Per-session line number

ps

string

Current ps display

session_start

string

Session start time

vxid

string

Virtual transaction ID

txid

string

Regular transaction ID

error_severity

string

Error severity

state_code

string

SQLSTATE code

message

string

Error message

detail

string

Error message detail

hint

string

Error message hint

internal_query

string

导致错误的内部查询

internal_position

number

游标索引进入内部查询

context

string

Error context

statement

string

Client-supplied query string

cursor_position

number

游标索引进入查询字符串

func_name

string

Error location function name

file_name

string

错误位置的文件名

file_line_num

number

错误位置的文件行号

application_name

string

Client application name

backend_type

string

Type of backend

leader_pid

number

活动并行工作人员的领导进程 ID

query_id

number

Query ID

20.8.6. Process Title #

这些设置控制如何修改服务器进程的进程标题。进程标题通常使用诸如 ps 或在 Windows 中使用 Process Explorer 之类的程序查看。有关详细信息,请参阅 Section 28.1

  • cluster_name (string) #

    • 设置一个名称,用于标识此数据库群集(实例)以供多方面使用。群集名称出现在此群集中的所有服务器进程的进程标题中。此外,它是备用连接的默认应用程序名称(请参阅 synchronous_standby_names)。

    • 该名称可以是少于 NAMEDATALEN_个字符(在标准构建中为 64 个字符)的任何字符串。只能在 _cluster_name_值中使用 ASCII 可打印字符。其他字符将被 C-style hexadecimal escapes替换。如果此参数设置为空字符串 _''(这是默认值),则不显示名称。此参数只能在服务器启动时设置。

  • update_process_title (boolean) #

    • 在服务器接收到新 SQL 命令时启用更新 process title。在大多数平台上此设置默认为 on ,但由于 Windows 要更新 process title 的开销较大,因此在 Windows 上默认为 off 。只有超级用户和拥有 SET 权限合适的用户可以更改此设置。