PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

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 支持多种记录服务器消息的方法,包括 stderr、csvlog、 jsonlog 和 syslog。在 Windows 上, 还支持 eventlog。把这个参数设置为 一个以逗号分隔的期望日志目的地列表。 默认只记录到 stderr。 这个参数只能在 postgresql.conf 文件中或服务器命令行上设置。

如果 csvlog 被包含在 log_destination 中, 日志条目将以“逗号分隔值” (CSV)格式输出,这种格式便于把日志载入 程序。 详情请参见 Section 19.8.4。 必须启用 logging_collector 才能生成 CSV 格式的日志输出。

如果 jsonlog 被包含在 log_destination 中, 日志条目将以 JSON 格式输出,这种格式便于把日志载入程序。 详情请参见 Section 19.8.5。 必须启用 logging_collector 才能生成 JSON 格式的日志输出。

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

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

当轮转产生新日志文件时,以及当 log_destination 被重新加载时, current_logfiles 会被重新创建。当 log_destination 不再包含 stderr、 csvlog 或 jsonlog 中的任何一个时, 以及当日志收集器被禁用时,它会被移除。

Note

在大多数 Unix 系统上,你需要修改系统 syslog 守护进程的配置,才能让 log_destination 的 syslog 选项发挥作用。PostgreSQL 可以记录到 syslog 的 LOCAL0 到 LOCAL7 设施(参见 syslog_facility), 但大多数平台上默认的 syslog 配置会丢弃所有这类消息。你需要把类似下面的内容:

local0.*    /var/log/postgresql

加入 syslog 守护进程的配置文件才能让它工作。

在 Windows 上,当你为 log_destination 使用 eventlog 选项时,应当向操作系统注册一个事件源及其库, 这样 Windows 事件查看器才能整洁地显示事件日志消息。 详情请参见 Section 18.12。

logging_collector (boolean) #

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

Note

不使用日志收集器而直接记录到 stderr 也是可行的;日志消息只会去往服务器 stderr 被指向的地方。然而,那种方法只适合日志量低的情形, 因为它不提供便利的日志文件轮转方式。此外, 在某些平台上不使用日志收集器可能导致日志输出丢失或混乱, 因为多个进程并发写同一个日志文件可能相互覆盖输出。

Note

日志收集器被设计为从不丢失消息。这意味着在负载极高时, 如果收集器已经落后,服务器进程可能在尝试发送更多日志消息时 被阻塞。相比之下,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 上这个参数被忽略。) 参数值预期是一个数字模式,采用 chmod 和 umask 系统调用接受的格式。 (要使用惯用的八进制格式,数字必须以 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.log 之类的 log_filename 结合使用,将产生 24 个每小时的日志文件,然后循环地覆盖它们。 这个参数只能在 postgresql.conf 文件中或服务器命令行上设置。

示例:要保留 7 天的日志,每天一个日志文件,命名为 server_log.Mon、 server_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 “设施”。你可以从 LOCAL0、LOCAL1、 LOCAL2、LOCAL3、 LOCAL4、LOCAL5、 LOCAL6、LOCAL7 中选择;默认值为 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。 这个参数只能在服务器启动时设置。

19.8.2. 日志输出时机与级别 #

log_min_messages (enum) #

控制写入服务器日志的 消息级别。 有效值是 DEBUG5、DEBUG4、 DEBUG3、DEBUG2、 DEBUG1、 INFO、NOTICE、 WARNING、 ERROR、LOG、 FATAL 和 PANIC。 每个级别都包括排在它后面的所有级别。 级别越靠后,发送到日志的消息越少。 默认值为 WARNING。 注意,LOG 在这里的级别与 client_min_messages 中的不同。 只有超级用户和具有相应 SET 权限的用户可以更改这个设置。

log_min_error_statement (enum) #

控制哪些导致错误条件的 SQL 语句被记录到服务器日志。 只要消息的 严重级别 达到指定级别或更高,当前 SQL 语句就会包含在该消息的日志条目中。 有效值是 DEBUG5、 DEBUG4、DEBUG3、 DEBUG2、DEBUG1、 INFO、NOTICE、 WARNING、ERROR、 LOG、 FATAL 和 PANIC。 默认值为 ERROR,这意味着导致错误、 日志消息、致命错误或恐慌的语句都会被记录。 要有效地关闭对失败语句的记录, 可以把这个参数设置为 PANIC。 只有超级用户和具有相应 SET 权限的用户可以更改这个设置。

log_min_duration_statement (integer) #

只要一条语句运行了至少指定的时间量, 就导致每条完成的语句的时长被记录。 例如,如果你把它设置为 250ms, 那么所有运行 250ms 或更长的 SQL 语句都会被记录。 启用这个参数有助于找出应用程序中未优化的查询。 如果这个值没有指定单位,则以毫秒为单位。 设置为零会打印所有语句的时长。 -1(默认值)禁用语句时长的记录。 只有超级用户和具有相应 SET 权限的用户可以更改这个设置。

这会覆盖 log_min_duration_sample, 即时长超过这个设置的查询不受采样约束,并且总是被记录。

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

Note

当把这个选项与 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 权限的用户可以更改这个设置。

Note

与所有语句日志记录选项一样, 这个选项可能带来显著的开销。

log_startup_progress_interval (integer) #

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

例如,如果同步数据目录花费 25 秒,随后重置非日志关系花费 8 秒,并且这个设置为默认值 10 秒, 那么数据目录在同步进行到 10 秒时会记录一条消息, 进行到 20 秒时会再次记录一条,但重置非日志关系则不会记录 任何消息。

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

Table 19.2. 消息严重级别对照

SeverityUsagesyslogeventlog
DEBUG1 .. DEBUG5提供供开发者使用的、逐级更详细的信息。DEBUGINFORMATION
INFO提供用户隐式请求的信息, 例如 VACUUM VERBOSE 的输出。INFOINFORMATION
NOTICE提供可能对用户有帮助的信息,例如, 长标识符被截断的通知。NOTICEINFORMATION
WARNING对可能出现的问题发出警告,例如在事务块之外的 COMMIT。NOTICEWARNING
ERROR报告一个导致当前命令中止的错误。WARNINGERROR
LOG报告管理员感兴趣的信息,例如检查点活动。INFOINFORMATION
FATAL报告一个导致当前会话中止的错误。ERRERROR
PANIC报告一个导致所有数据库会话中止的错误。CRITERROR

19.8.3. 日志记录内容定制 #

Note

你选择记录的内容可能带来安全影响; 参见 Section 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_parse、 debug_print_rewritten 或 debug_print_plan 产生的消息进行缩进。这会产生比关闭时使用的 “紧凑”格式更可读但长得多输出。 它默认开启。

log_autovacuum_min_duration (integer) #

只要自动清理执行的每个动作运行了至少指定的时间量, 就导致它被记录。设置为零会记录所有自动清理动作。 -1 禁用自动清理动作的记录。 如果这个值没有指定单位,则以毫秒为单位。 例如,如果你把它设置为 250ms,那么所有运行 250ms 或更长的自动清理和自动分析都会被记录。 此外,当这个参数被设置为 -1 以外的任何值时,如果某个自动清理动作因冲突锁或并发删除的 关系而被跳过,也会记录一条消息。 默认值为 10min。 启用这个参数有助于跟踪自动清理活动。 这个参数只能在 postgresql.conf 文件中或服务器命令行上设置; 但可以通过更改表存储参数为单个表覆盖该设置。

log_checkpoints (boolean) #

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

log_connections (string) #

导致每次到服务器的连接的某些方面被记录。 默认值为空字符串 '', 它禁用所有连接日志记录。以下选项可以单独指定, 也可以放在以逗号分隔的列表中:

Table 19.3. 连接与会话审计选项

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

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

为了向后兼容,on、off、 true、false、 yes、no、 1 和 0 仍然受支持。正值等同于指定 receipt、authentication 和 authorization 选项。

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

Note

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

log_disconnections (boolean) #

导致会话终止被记录。日志输出提供的信息与 log_connections 类似, 再加上会话的时长。 只有超级用户和具有相应 SET 权限的用户可以在会话开始时更改这个参数, 并且它在会话内完全不能被更改。 默认值为 off。

log_duration (boolean) #

导致每条完成的语句的时长被记录。 默认值为 off。 只有超级用户和具有相应 SET 权限的用户可以更改这个设置。

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

Note

启用 log_duration 与把 log_min_duration_statement 设置为零之间的区别在于:超过 log_min_duration_statement 会强制记录查询的文本,而这个选项不会。 因此,如果 log_duration 为 on 且 log_min_duration_statement 为正值,所有时长都会被记录,但查询文本只对超过阈值的语句 包含。这种行为在高负载安装中收集统计信息时可能有用。

log_error_verbosity (enum) #

控制写入服务器日志的每条消息的详细程度。 有效值是 TERSE、 DEFAULT 和 VERBOSE, 每一个都会向显示的消息添加更多字段。 TERSE 排除对 DETAIL、HINT、 QUERY 和 CONTEXT 错误信息的记录。 VERBOSE 输出包括 SQLSTATE 错误码(另请参见 Appendix A)以及产生该错误的源代码 文件名、函数名和行号。 只有超级用户和具有相应 SET 权限的用户可以更改这个设置。

log_hostname (boolean) #

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

log_line_prefix (string) #

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

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

EscapeEffectSession only
%aApplication nameyes
%u用户名yes
%d数据库名yes
%r远程主机名或 IP 地址,以及远程端口yes
%h远程主机名或 IP 地址yes
%L本地地址(客户端所连接到的服务器上的 IP 地址)yes
%bBackend typeno
%p进程 IDno
%P并行组领导者的进程 ID(如果该进程是并行查询工作进程)no
%t不带毫秒的时间戳no
%m带毫秒的时间戳no
%n带毫秒的时间戳(以 Unix 纪元表示)no
%i命令标签:会话当前命令的类型yes
%eSQLSTATE 错误码no
%c会话 ID:见下文no
%l每个会话或进程的日志行编号,从 1 开始no
%s进程启动时间戳no
%v虚拟事务 ID(procNumber/localXID); 参见 Section 67.1no
%x事务 ID(如果未分配则为 0); 参见 Section 67.1no
%q不产生输出,但告诉非会话进程在字符串的这个位置停止; 会被会话进程忽略no
%Q当前查询的查询标识符。 默认不计算查询标识符,因此除非启用了 compute_query_id 参数,或配置了计算查询标识符的第三方模块, 否则这个字段将为零。yes
%%Literal %no

后端类型对应于视图 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;

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 会在标识符可以被计算之前产生输出, 包括无法计算标识符的无效语句。

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_statement、 log_min_duration_statement 及相关设置而打印的日志消息。 这个设置的非零值会增加一些开销, 尤其当参数以二进制形式发送时, 因为那样需要进行到文本的转换。

log_parameter_max_length_on_error (integer) #

如果大于零,错误消息中报告的每个绑定参数值都会被修剪到这个 字节数。 零(默认值)会禁用在错误消息中包含绑定参数。 -1 允许完整打印绑定参数。 如果这个值没有指定单位,则以字节为单位。

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

log_statement (enum) #

控制记录哪些类型的 SQL 语句(none、ddl、mod、all)。 有效值是 none(关闭)、ddl、 mod 和 all(所有语句)。 ddl 记录所有数据定义语句, 例如 CREATE、ALTER 和 DROP 语句。 mod 记录所有 ddl 语句, 加上数据修改语句,例如 INSERT、 UPDATE、DELETE、 TRUNCATE 和 COPY FROM。 PREPARE、EXECUTE 和 EXPLAIN ANALYZE 语句在其包含的命令属于适当类型时也会被记录。 对于使用扩展查询协议的客户端, 会在收到 Execute 消息时进行记录, 并且会包括 Bind 参数的值 (其中内嵌的单引号会被写成双引号)。

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

Note

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

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

log_replication_commands (boolean) #

导致每条复制命令以及 walsender 进程的复制槽获取/释放被记录到服务器日志。 有关复制命令的更多信息,请参见 Section 54.4。默认值为 off。只有超级用户和具有相应 SET 权限的用户可以更改这个设置。

log_temp_files (integer) #

控制临时文件名和大小的记录。 临时文件可能为排序、哈希和临时查询结果而创建。 如果被这个设置启用,那么每个临时文件在删除时都会产生一条 日志条目,并指定以字节计的文件尺寸。 值为零会记录所有临时文件信息,而正值只记录尺寸大于等于指定 数据量的文件。 如果这个值没有指定单位,则以千字节为单位。 默认设置为 -1,它禁用此类记录。 只有超级用户和具有相应 SET 权限的用户可以更改这个设置。

log_timezone (string) #

设置写入服务器日志的时间戳所用的时区。 与 TimeZone 不同, 这个值是集群范围的,这样所有会话才能一致地报告时间戳。 内置默认值为 GMT, 但它通常会在 postgresql.conf 中被覆盖;initdb 会在那里安装一个与其系统环境相应的设置。 更多信息请参见 Section 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_filename 和 log_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 对象,其中的键及其关联值的集合 显示在 Table 19.4 中。

Table 19.4. JSON 日志键值字典说明

键名类型描述
timestampstring带毫秒的时间戳
userstring用户名
dbnamestring数据库名
pidnumber进程 ID
remote_hoststring客户端主机
remote_portnumber客户端端口
session_idstring会话 ID
line_numnumber每会话行号
psstring当前 ps 显示
session_startstring会话开始时间
vxidstring虚拟事务 ID
txidstring常规事务 ID
error_severitystring错误严重级别
state_codestringSQLSTATE 码
messagestring错误消息
detailstring错误消息详情
hintstring错误消息提示
internal_querystring导致错误的内部查询
internal_positionnumber内部查询中的游标索引
contextstring错误上下文
statementstring客户端提供的查询字符串
cursor_positionnumber查询字符串中的游标索引
func_namestring错误位置的函数名
file_namestring错误位置的文件名
file_line_numnumber错误位置的文件行号
application_namestring客户端应用程序名
backend_typestring后端类型
leader_pidnumber活动并行工作进程的领导者进程 ID
query_idnumberQuery ID

19.8.6. 进程标题显示 #

这些设置控制服务器进程的进程标题如何被修改。 进程标题通常使用 ps 之类的程序查看,在 Windows 上则使用 Process Explorer。 详情请参见 Section 27.1。

cluster_name (string) #

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

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

update_process_title (boolean) #

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