17.7. 错误报告和日志

17.7.1. 在哪里记录日志

log_destination (string)

PostgreSQL 支持多种记录服务器日志的方法, 包括 stderrsyslog。 在 Windows 里,还支持 eventlog。 允许把 syslog 作为日志系统。 把这个选项设置为一个逗号分隔的日志目标的列表。缺省是只记录到 stderr。 这个选项只能在服务器启动的时候在 postgresql.conf 文件里面设置。

redirect_stderr (boolean)

这个选项允许把那些发送到 stderr 的消息捕获下来, 然后把它们重定向到日志文件里。这个选项,加上日志记录到 stderr 里的组合, 通常比记录到 syslog 更有用, 因为有些消息类型不出现在 syslog 输出(一个常见的例子是动态连接失败消息)。 这个选项只能在服务器启动的时候设置。

log_directory (string)

在打开了 redirect_stderr 的时候, 这个选项判断日志文件在哪个目录里创建。 它可以声明成绝对路径,或者是与集群的数据目录相对的路径。 这个选项只能在服务器启动的时候在 postgresql.conf 文件里面设置。

log_filename (string)

在打开了 redirect_stderr 的时候,这个选项设置所创建的日志文件的文件名。 这个数值是当作 strftime 模式看待的。 因此 % 逃逸可以声明因时间而变的文件名。 如果没有出现 % 逃逸, PostgreSQL 将附着日志文件打开的纪元时间。 比如,如果 log_filenameserver_log, 那么选择的文件名将是 server_log.1093827753 — 假如日志文件开始于 Sun Aug 29 19:02:33 2004 MST 的话。 这个选项只能在服务器启动的时候在 postgresql.conf 文件里面设置。

log_rotation_age (integer)

在打开了 redirect_stderr 的时候, 这个选项设置一个独立的日志文件的最大生存期。 在数值指定的分钟过去之后,将创建一个新的日志文件。 设置为零可以关闭以时间为基础的新日志文件的创建。 这个选项只能在服务器启动的时候在 postgresql.conf 文件里面设置。

log_rotation_size (integer)

在打开了 redirect_stderr 的时候, 这个选项设置一个独立的日志文件的最大尺寸。 在数值指定的千字节写入日志文件之后,将会创建一个新的日志文件。 设置为零可以关闭以尺寸为基础的新日志文件的创建。 这个选项只能在服务器启动的时候在 postgresql.conf 文件里面设置。

log_truncate_on_rotation (boolean)

如果打开了 redirect_stderr,这个选项将导致 PostgreSQL 截断(覆盖),而不是附加到任何同名的现有日志文件上。 不过,截断只是发生在因为以时间为基础的旋转的时候创建的新文件上, 而不是在服务器启动的时候或者以尺寸为基础的旋转上。 如果为 off,将在任何情况下都是向已经存在的文件背后追加的。 比如,使用这个选项和类似 postgresql-%H.log 这样的 log_filename 将导致生成 24 个按小时生成的日志文件然后在这些文件上循环。 这个选项只能在服务器启动的时候在 postgresql.conf 文件里面设置。

例子:保留 7 天的日志,每天一个日志文件,叫做 server_log.Monserver_log.Tue,等等,并且上周的日志会自动被这周的日志覆盖, 把 log_filename 设置为 server_log.%alog_truncate_on_rotation 设置为 on, 并且把 log_rotation_age 设置为 1440

例子:保留 24 小时的日志,每小时一个日志,但是如果日志文件尺寸大于 1GB 也旋转日志, 设置 log_filenameserver_log.%H%Mlog_truncate_on_rotationonlog_rotation_age60,并且把 log_rotation_size 设置为 1000000。 在 log_filename 里包含 %M 允许任何尺寸驱动的旋转选取一个和开始的文件名同小时数但是名字不同的文件。

syslog_facility (string)

如果把日志记录到 syslog 功能打开, 那么这个选项在打开syslog后判断要使用的 syslog "设施"。 你可以从 LOCAL0LOCAL1LOCAL2LOCAL3LOCAL4LOCAL5LOCAL6LOCAL7 中选择;缺省是LOCAL0。 又见你的系统的 syslog 守护进程文档。这个选项只能在服务器启动的时候设置。

syslog_ident (string)

如果打开了向syslog中记日志的功能, 这个选项决定用于在 syslog 日志中标识 PostgreSQL 的程序名。缺省是 postgres。 这个选项只能在服务器启动的时候设置。

17.7.2. 什么时候记日志

client_min_messages (string)

这个选项控制那些信息发送到客户端。 有效的数值是 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1LOGNOTICEWARNINGERROR。 每个级别包含所有它后面的级别,级别越靠后,发送的信息越少。 缺省是 NOTICE。这里的 LOGlog_min_messages 里面的有不同的级别。

log_min_messages (string)

控制写到服务器日志里的信息的详细程度。有效值是 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORLOGFATAL,和 PANIC。 每个级别都包含它后面的级别。越靠后的数值发往服务器日志的信息越少。 缺省是 NOTICE。请注意 LOGclient_min_messages 里面的同名级别优先级不同。 只有超级用户可以修改这个设置。

log_error_verbosity (string)

控制记录的每条信息写到服务器日志里的详细程度。 有效的值是 TERSEDEFAULT,和 VERBOSE, 每个都会向显示的信息里增加更多的字段。只有超级用户可以改变这个设置。

log_min_error_statement (string)

控制是否在服务器日志里输出那些导致错误条件的 SQL 语句。 所有导致一个特定级别(或者更高级别)的错误的 SQL 语句都要被记录日志。 缺省是 PANIC(实际上是把这个特性关闭了)。 有效的值有 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORFATAL,和 PANIC。 比如,如果你把这个设置为 ERROR, 那么所有导致错误,致命错误,或者恐慌的 SQL 语句都将被记录日志。 打开这个选项可以帮助跟踪那些在服务器日志里出现的任何错误的源头。 只有超级用户可以改变这个设置。

log_min_duration_statement (integer)

如果某个语句的持续时间大于或者等于这个数字的毫秒数, 那么在一个日志行上记录该语句以及其持续时间。 把这个设置为零将打印所有的查询和他们的持续时间。 设置为负一(缺省值)关闭这个功能。比如,如果你把它设置为 250, 那么所有运行时间等于或者超过 250ms 的 SQL 语句都会被记录日志。 打开这个选项可以很方便地跟踪你的应用里那些没有优化的查询。 这个设置独立于 log_statementlog_duration。 只有超级用户可以修改这个设置。

silent_mode (boolean)

安静的运行服务器。如果设置了这个选项,服务器将自动在后台运行并且与控制终端脱开 (和 postmaster-S 选项效果一样)。 服务器的标准输出和标准错误重定向到 /dev/null,因此,发送的任何信息都将丢失。 除非打开了 syslog 日志或者打开了 redirect_stderr, 否则我们不建议使用这个选项,因为它让我们很难看到错误信息。

这里是这个设置里用到各种信息严重程度类型的一个列表:

DEBUG[1-5]

这个提供开发人员使用的信息。

INFO

这个提供用户隐含要求的信息,比如在 VACUUM VERBOSE 过程中的信息。

NOTICE

这个提供可能对用户有帮助的信息,比如,长标识符的截断, 作为主键一部分创建的索引。

WARNING

这个提供给用户的警告,比如在事务块范围之外的 COMMIT

ERROR

报告导致当前命令退出的错误。

LOG

这个报告一些管理员感兴趣的信息,比如,检查点活跃性。

FATAL

这个报告为什么当前会话终止。

PANIC

报告导致所有会话退出的原因。

17.7.3. 记录什么

debug_print_parse (boolean)
debug_print_rewritten (boolean)
debug_print_plan (boolean)
debug_pretty_print (boolean)

这个选项打开出的各种调试输出。 对于执行的每个查询,它们打印生成的它生成的分析树,查询重写,或者执行规划。 debug_pretty_print 把这些输出进行缩进,会生成漂亮些但是长一些的输出格式。 client_min_messages 或者 log_min_messages 必须是 DEBUG1 或者更低才实际上把输出发往客户端或者服务器日志。这些选项缺省都是关闭的。

log_connections (boolean)

这样会在每次成功的联接的时候都向服务器日志里打印一行详细信息。 缺省时是关闭的,尽管它可能很有用。 有些客户端程序,比如 psql,在判断是否需要口令的时候试图连接两次, 因此,重复的"connection receive(收到连接请求)"并不意味着一定是问题。 这个选项只能在服务器启动的时候设置, 或者在 postgresql.conf 配置文件里设置。

log_disconnections (boolean)

这个选项在会话结束的时候在服务器日志里输出一行,类似 log_connections。 缺省是关闭的。这个选项只能在服务器开始时设置或者在 postgresql.conf 配置文件里设置。

log_duration (boolean)

导致每个满足 log_statement 之条件已完成语句的持续时间都写入日志。要使用这个选项, 而你又不使用 syslog,那么我们建议你用 log_line_prefix 记录 PID 或者会话 ID, 这样你就可以用进程 ID 或者会话 ID 把语句和持续时间连接起来。 缺省是 off。如果管理员打开过它,那么只有超级用户可以修改这个设置。

log_line_prefix (string)

这是一个 printf 风格的字串,在日志的每行开头输出。 缺省时一个空字串。每个可识别的逃逸都会按照下面说明的那样逃逸 - 任何其它看起来像逃逸的都会被忽略。 其它字符都直接拷贝到日志行中。有些逃逸只被会话进程识别,不能应用于后端进程,比如 postmaster。 Syslog 生成自己的时间戳和进程 ID 信息,因此,如果你使用了 syslog, 可能不会想使用那些逃逸。这个选项只能在服务器启动或者 postgresql.conf 配置文件里设置。

逃逸效果仅用于会话
%u用户名
%d数据库名
%r远程主机名或者 IP 地址,以及远端端口
%h远程主机名或者 IP 地址
%p进程 ID
%t时间戳(没有毫秒)
%m带毫秒的时间戳
%i命令标签。这是生成日志行的命令。
%c 会话 ID。一个每个会话的唯一标识符。 它是两个 4 字节的十六进制数字(没有前导零),用句点分开。 数字是会话开始时间和进程 ID,因此也可以用做一种打印这些项目的节约空间的方法。
%l 每个进程的日志行的编号,从 1 开始。
%s会话开始的时间戳
%x事务 ID
%q 不生成任何输出,但是告诉非会话进程在字串的这个位置停止。 被会话进程忽略。
%%文本 %

log_statement (string)

控制记录哪个 SQL 语句。有效的值是 noneddlmod,和 allddl 记录所有数据定义命令, 比如 CREATEALTER,和 DROP 命令。 mod 记录所有 ddl 语句, 加上 INSERTUPDATEDELETETRUNCATE,和 COPY FROM。如果所包含的命令类型对路,那么PREPAREEXPLAIN ANALYZE 语句也同样被记录。

缺省是 none。只有超级用户可以修改这个设置。

注意: EXECUTE 语句不认为是 ddl 或者 mod 语句。 如果记录它的日志,那么只有准备好的语句的名字被记录,不包括实际的准备好的语句。

如果一个函数用一种类似 PL/pgSQL 的服务器端编程语言定义, 那么,任何该函数执行的查询都只在该函数第一此调用的时候记录日志。 这是因为 PL/pgSQL 为函数里的 SQL 语句保存一份该查询规划的缓存。

log_hostname (boolean)

缺省时,联接日志只记录所联接主机的 IP 地址。 打开这个选项导致同时记录主机名。 请注意,这样有可能带来一些不可忽略的性能损失, — 取决于你的名字解析的设置。这个选项只能在服务器启动的时候或者在 postgresql.conf 里设置。