20.8. 错误报告和日志记录#
20.8.1. 记录位置#
log_destination
(string
) #PostgreSQL 支持多种记录服务器消息的方法,包括 stderr、csvlog、jsonlog 和 syslog。在 Windows 上还支持 eventlog。将此参数设置为以逗号分隔的所需日志目标列表。默认仅记录到 stderr。此参数只能在
postgresql.conf
文件或服务器命令行中设置。如果
log_destination
中包含 csvlog,日志条目将以 “逗号分隔值” () 格式输出,这便于将日志加载到程序中。有关详细信息,请参见 第 20.8.4 节。必须启用 logging_collector 才能生成 CSV 格式的日志输出。如果
log_destination
中包含 jsonlog,日志条目将以 格式输出,这便于将日志加载到程序中。有关详细信息,请参见 第 20.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 中的任何一个,以及当日志收集器被禁用时,将删除它。注意
在大多数 Unix 系统上,您需要更改系统 syslog 守护程序的配置,才能使用
log_destination
的 syslog 选项。PostgreSQL 可以记录到LOCAL0
到LOCAL7
的 syslog 设施(参见 syslog_facility),但大多数平台上的默认 syslog 配置将丢弃所有此类消息。您需要添加类似以下内容local0.* /var/log/postgresql
到 syslog 守护进程的配置文件中使其工作。
在 Windows 上,当您对
log_destination
使用eventlog
选项时,您应该向操作系统注册事件源及其库,以便 Windows 事件查看器可以清晰地显示事件日志消息。有关详细信息,请参见 第 19.12 节。logging_collector
(布尔值
) #此参数启用日志收集器,这是一个后台进程,它捕获发送到 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
(整数
) #在 Unix 系统上,当
logging_collector
启用时,此参数设置日志文件的权限。(在 Microsoft Windows 上此参数将被忽略。)参数值应为chmod
和umask
系统调用接受的格式中指定的数字模式。(要使用惯用的八进制格式,数字必须以0
(零)开头。)默认权限为
0600
,这意味着只有服务器所有者可以读取或写入日志文件。另一个常用的设置是0640
,允许所有者组的成员读取文件。但请注意,要使用此类设置,您需要更改 log_directory,将文件存储在群集数据目录之外的某个位置。无论如何,不建议将日志文件设为世界可读,因为它们可能包含敏感数据。此参数只能在
postgresql.conf
文件中或在服务器命令行上设置。log_rotation_age
(整数
) #当
logging_collector
启用时,此参数确定使用单个日志文件的最大时间量,之后将创建一个新的日志文件。如果未指定单位,则此值将以分钟为单位。默认值为 24 小时。设置为零以禁用基于时间的创建新日志文件。此参数只能在postgresql.conf
文件或服务器命令行中设置。log_rotation_size
(整数
) #当
logging_collector
启用时,此参数确定单个日志文件的最大大小。将此数据量写入日志文件后,将创建一个新的日志文件。如果未指定单位,则此值将以千字节为单位。默认值为 10 兆字节。设置为零以禁用基于大小的创建新日志文件。此参数只能在postgresql.conf
文件或服务器命令行中设置。log_truncate_on_rotation
(布尔值
) #当
logging_collector
启用时,此参数将导致 PostgreSQL 截断(覆盖)同名任何现有日志文件,而不是追加到该文件。但是,仅当由于基于时间的轮换而打开新文件时才会发生截断,而不是在服务器启动或基于大小的轮换期间。关闭时,在所有情况下都将追加到现有文件。例如,将此设置与类似于log_filename
的postgresql-%H.log
结合使用将生成二十四小时日志文件,然后循环覆盖它们。此参数只能在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 “facility”。您可以从
LOCAL0
、LOCAL1
、LOCAL2
、LOCAL3
、LOCAL4
、LOCAL5
、LOCAL6
、LOCAL7
中进行选择;默认值为LOCAL0
。另请参阅系统 syslog 守护进程的文档。此参数只能在postgresql.conf
文件或服务器命令行中设置。syslog_ident
(string
) #当记录到 syslog 被启用时,此参数确定用于标识 PostgreSQL 消息的程序名称,在 syslog 日志中。默认值为
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
文件或服务器命令行中设置。
20.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,这意味着持续时间超过此设置的查询不受抽样限制,并且始终记录在日志中。
对于使用扩展查询协议的客户端,解析、绑定和执行步骤的持续时间将独立记录在日志中。
注意
当将此选项与 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
权限的用户才能更改此设置。注意
与所有语句记录选项一样,此选项可能会增加大量开销。
log_startup_progress_interval
(integer
) #设置启动过程在仍处于进行中的长时间运行操作后记录一条消息的时间量,以及该操作的进一步进度消息之间的间隔。默认值为 10 秒。设置为
0
会禁用此功能。如果未指定此值单位,则将其视为毫秒。此设置分别应用于每个操作。此参数只能在postgresql.conf
文件中或在服务器命令行中设置。例如,如果同步数据目录需要 25 秒,之后重置未记录的关系需要 8 秒,并且此设置具有 10 秒的默认值,那么在同步数据目录进行 10 秒后和进行 20 秒后将记录一条消息,但不会记录任何重置未记录关系的消息。
表 20.2说明了PostgreSQL使用的消息严重性级别。如果记录输出发送到syslog或 Windows 的eventlog,则严重性级别将按表中所示进行转换。
表 20.2. 消息严重性级别
严重性 | 用法 | syslog | eventlog |
---|---|---|---|
DEBUG1 .. DEBUG5 | 为开发者提供越来越详细的信息。 | DEBUG | 信息 |
信息 | 提供用户隐式请求的信息,例如 VACUUM VERBOSE 的输出。 | 信息 | 信息 |
通知 | 提供可能对用户有帮助的信息,例如,截断长标识符的通知。 | 通知 | 信息 |
警告 | 提供可能出现问题的警告,例如,在事务块外部 COMMIT 。 | 通知 | 警告 |
错误 | 报告导致当前命令中止的错误。 | 警告 | 错误 |
日志 | 报告管理员感兴趣的信息,例如,检查点活动。 | 信息 | 信息 |
致命 | 报告导致当前会话中止的错误。 | 错误 | 错误 |
恐慌 | 报告导致所有数据库会话中止的错误。 | 严重 | 错误 |
20.8.3. 要记录的内容#
注意
选择记录的内容可能涉及安全问题;请参见第 25.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
,则所有运行时间为 250 毫秒或更长的自动真空和分析都将被记录。此外,当此参数被设置为-1
以外的任何值时,如果由于冲突锁或同时删除关系而跳过自动真空操作,则会记录一条消息。默认值为10min
。启用此参数有助于跟踪自动真空活动。此参数只能在postgresql.conf
文件或服务器命令行中设置;但可以通过更改表存储参数来覆盖各个表的设置。log_checkpoints
(boolean
) #导致检查点和重启点记录在服务器日志中。一些统计信息包含在日志消息中,包括写入的缓冲区数量和写入它们所花费的时间。此参数只能在
postgresql.conf
文件或服务器命令行中设置。默认情况下,此项处于开启状态。log_connections
(boolean
) #导致每次尝试连接服务器都会被记录,以及客户端身份验证(如果需要)和授权的成功完成。只有超级用户和具有适当
SET
权限的用户可以在会话开始时更改此参数,并且在会话中根本无法更改。默认值为off
。注意
一些客户端程序,如 psql,在确定是否需要密码时会尝试连接两次,因此重复的 “connection received” 消息并不一定表示有问题。
log_disconnections
(boolean
) #导致会话终止被记录。日志输出提供类似于
log_connections
的信息,以及会话的持续时间。只有超级用户和具有适当SET
权限的用户可以在会话开始时更改此参数,并且在会话中根本无法更改。默认值为off
。log_duration
(boolean
) #导致每个已完成语句的持续时间被记录。默认值为
off
。只有超级用户和具有适当SET
权限的用户可以更改此设置。对于使用扩展查询协议的客户端,解析、绑定和执行步骤的持续时间将独立记录在日志中。
注意
启用
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
错误代码(另请参见 附录 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 (backendID/localXID);请参见 第 74.1 节 否 %x
事务 ID(如果未分配,则为 0);请参见 第 74.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_statement、log_duration 和相关设置而打印的日志消息。此设置的非零值会增加一些开销,特别是如果以二进制形式发送参数,因为那时需要转换为文本。
log_parameter_max_length_on_error
(integer
) #如果大于零,则错误消息中报告的每个绑定参数值都将被修剪为这么多字节。零(默认值)禁用在错误消息中包含绑定参数。
-1
允许完整打印绑定参数。如果未指定此值单位,则将其视为字节。此设置的非零值会增加开销,因为 PostgreSQL 需要在每个语句开始时将参数值的文本表示形式存储在内存中,无论最终是否发生错误。当绑定参数以二进制形式发送时,开销大于以文本形式发送时,因为前一种情况需要数据转换,而后一种情况只需要复制字符串。
log_statement
(enum
) #控制记录哪些 SQL 语句。有效值包括
none
(关闭)、ddl
、mod
和all
(所有语句)。ddl
记录所有数据定义语句,例如CREATE
、ALTER
和DROP
语句。mod
记录所有ddl
语句,以及数据修改语句,例如INSERT
、UPDATE
、DELETE
、TRUNCATE
和COPY FROM
。如果包含的命令属于适当类型,则还记录PREPARE
、EXECUTE
和EXPLAIN ANALYZE
语句。对于使用扩展查询协议的客户端,记录在收到执行消息时发生,并且包括绑定参数的值(任何嵌入的单引号加倍)。默认值为
none
。只有超级用户和具有适当SET
权限的用户才能更改此设置。注意
即使
log_statement
=all
,包含简单语法错误的语句也不会被记录,因为日志消息仅在执行基本解析以确定语句类型后才会发出。对于扩展查询协议,此设置同样不会记录在执行阶段之前失败的语句(即在解析分析或规划期间)。将log_min_error_statement
设置为ERROR
(或更低)以记录此类语句。记录的语句可能会泄露敏感数据,甚至包含明文密码。
log_replication_commands
(boolean
) #导致每个复制命令记录在服务器日志中。有关复制命令的更多信息,请参阅 第 55.4 节。默认值为
off
。只有超级用户和具有适当SET
权限的用户才能更改此设置。log_temp_files
(integer
) #控制临时文件名和大小的日志记录。可以为排序、哈希和临时查询结果创建临时文件。如果通过此设置启用,则在删除每个临时文件时都会发出一个日志条目,其中文件大小以字节为单位指定。值为零时记录所有临时文件信息,而正值仅记录大小大于或等于指定数据量大小的文件。如果未指定此值单位,则将其视为千字节。默认设置为 -1,禁用此类日志记录。只有超级用户和具有适当
SET
权限的用户才能更改此设置。log_timezone
(string
) #设置用于在服务器日志中写入的时间戳的时间区域。与 TimeZone 不同,此值是群集范围的,因此所有会话将一致地报告时间戳。内置默认值为
GMT
,但通常在postgresql.conf
中被覆盖;initdb 将在此处安装与系统环境相对应的设置。有关更多信息,请参阅 第 8.5.3 节。此参数只能在postgresql.conf
文件或服务器命令行中设置。
20.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 日志文件的导入
设置
log_filename
和log_rotation_age
以为您日志文件提供一致、可预测的命名方案。这使您可以预测文件名,并知道何时完成单个日志文件,因此可以导入该文件。将
log_rotation_size
设置为 0 以禁用基于大小的日志轮换,因为它使日志文件名难以预测。将
log_truncate_on_rotation
设置为on
,以便不会将旧日志数据与新数据混合在同一文件中。上述表定义包括主键规范。这有助于防止意外导入相同的信息两次。
COPY
命令一次提交其导入的所有数据,因此任何错误都将导致整个导入失败。如果您导入部分日志文件,然后在完成后再次导入该文件,则主键冲突将导致导入失败。在导入之前,请等到日志完成并关闭。此过程还将防止意外导入尚未完全写入的部分行,这也会导致COPY
失败。
20.8.5. 使用 JSON 格式日志输出#
在log_destination
列表中包含jsonlog
提供了一种将日志文件导入到许多不同程序中的便捷方式。此选项以JSON格式发出日志行。
具有空值的字符串字段将从输出中排除。将来可能会添加其他字段。处理jsonlog
输出的用户应用程序应忽略未知字段。
每行日志都将序列化为一个 JSON 对象,其中包含一组键及其关联值,如表 20.3中所示。
表 20.3. JSON 日志条目的键和值
键名 | 类型 | 说明 |
---|---|---|
timestamp | 字符串 | 带毫秒的时间戳 |
user | 字符串 | 用户名 |
dbname | 字符串 | 数据库名称 |
pid | 数字 | 进程 ID |
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 |
20.8.6. 进程标题#
这些设置控制如何修改服务器进程的进程标题。进程标题通常使用ps等程序或在 Windows 上使用Process Explorer查看。有关详细信息,请参见第 28.1 节。
cluster_name
(字符串
) #设置一个名称,用于识别此数据库集群(实例)以用于各种目的。集群名称显示在此集群中所有服务器进程的进程标题中。此外,它是备用连接的默认应用程序名称(请参见 synchronous_standby_names。)
名称可以是小于
NAMEDATALEN
字符的任意字符串(在标准构建中为 64 个字符)。cluster_name
值中只能使用可打印的 ASCII 字符。其他字符将替换为 C 样式十六进制转义符。如果此参数设置为空字符串''
(这是默认值),则不显示名称。此参数只能在服务器启动时设置。update_process_title
(boolean
) #每次服务器收到新的 SQL 命令时,启用进程标题更新。此设置在大多数平台上的默认值为
on
,但在 Windows 上的默认值为off
,因为该平台更新进程标题的开销较大。只有超级用户和具有相应SET
权限的用户才能更改此设置。