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 中的任何一个时,
以及当日志收集器被禁用时,它会被移除。
在大多数 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
之类脚本产生的错误消息。)
这个参数只能在服务器启动时设置。
不使用日志收集器而直接记录到 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 上这个参数被忽略。)
参数值预期是一个数字模式,采用
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。
这个参数只能在服务器启动时设置。
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 步骤的时长会被独立记录。
当把这个选项与 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 秒时会再次记录一条,但重置非日志关系则不会记录 任何消息。
Table 19.2 解释了 PostgreSQL 使用的消息严重级别。如果日志输出发送到 syslog 或 Windows 的 eventlog, 严重级别会按照表中进行转换。
Table 19.2. 消息严重级别对照
| 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 |
你选择记录的内容可能带来安全影响; 参见 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
权限的用户可以在会话开始时更改这个参数,
并且它在会话内完全不能被更改。
某些客户端程序(例如 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_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。
| Escape | Effect | Session only |
|---|---|---|
%a | Application name | yes |
%u | 用户名 | yes |
%d | 数据库名 | yes |
%r | 远程主机名或 IP 地址,以及远程端口 | yes |
%h | 远程主机名或 IP 地址 | yes |
%L | 本地地址(客户端所连接到的服务器上的 IP 地址) | yes |
%b | Backend type | no |
%p | 进程 ID | no |
%P | 并行组领导者的进程 ID(如果该进程是并行查询工作进程) | no |
%t | 不带毫秒的时间戳 | no |
%m | 带毫秒的时间戳 | no |
%n | 带毫秒的时间戳(以 Unix 纪元表示) | no |
%i | 命令标签:会话当前命令的类型 | yes |
%e | SQLSTATE 错误码 | no |
%c | 会话 ID:见下文 | no |
%l | 每个会话或进程的日志行编号,从 1 开始 | no |
%s | 进程启动时间戳 | no |
%v | 虚拟事务 ID(procNumber/localXID); 参见 Section 67.1 | no |
%x | 事务 ID(如果未分配则为 0); 参见 Section 67.1 | no |
%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;
如果你为 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_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
权限的用户可以更改这个设置。
包含简单语法错误的语句不会被记录,即使
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
文件中或服务器命令行上设置。
在 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 失败。
在 log_destination
列表中包含 jsonlog
提供了一种把日志文件导入许多不同程序的便利方式。
这个选项以 JSON 格式产生日志行。
具有空值的字符串字段会从输出中排除。
将来可能会添加更多字段。处理 jsonlog
输出的用户应用应当忽略未知的字段。
每行日志都被序列化为一个 JSON 对象,其中的键及其关联值的集合 显示在 Table 19.4 中。
Table 19.4. 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 | Query ID |
这些设置控制服务器进程的进程标题如何被修改。 进程标题通常使用 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
权限的用户可以更改这个设置。