19.8. 错误报告和记录

19 .8.1. 在哪里记录

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

当包括 stderr 或 csvlog 时,将创建文件current_logfiles来记录日志收集器和关联的日志目标当前正在使用的日志文件的位置。这提供了一种方便的方法来查找实例当前正在使用的日志。这是此文件内容的示例:

stderr log/postgresql.log
csvlog log/postgresql.csv

当由于轮换而创建新的日志文件时以及重新加载log_destination时,将重新创建current_logfiles。当log_destination中既不包含 stderr 也不包含 csvlog 时,并且禁用了日志收集器时,将其删除。

Note

在大多数 Unix 系统上,您需要更改系统 syslog 守护程序的配置,以便使用log_destination的 syslog 选项。 PostgreSQL 可以登录LOCAL0LOCAL7到 syslog 工具(请参阅syslog_facility),但是大多数平台上的默认 syslog 配置将丢弃所有此类消息。您将需要添加以下内容:

local0.*    /var/log/postgresql

到 syslog 守护程序的配置文件以使其正常工作。

在 Windows 上,当对log_destination使用eventlog选项时,应在 os 上注册事件源及其库,以便 Windows Event Viewer 可以干净地显示事件日志消息。有关详情,请参见Section 18.11

Note

无需使用日志收集器就可以登录到 stderr。日志消息将仅到达服务器 stderr 指向的任何位置。但是,该方法仅适用于较小的日志量,因为它不提供旋转日志文件的简便方法。另外,在某些不使用日志收集器的平台上,可能会导致日志输出丢失或出现乱码,因为同时写入同一日志文件的多个进程可能会覆盖彼此的输出。

Note

日志收集器旨在永不丢失消息。这意味着在负载极高的情况下,当收集器落后时,尝试发送其他日志消息时服务器进程可能会被阻塞。相反,如果 syslog 无法写入消息,则倾向于删除消息,这意味着在这种情况下它可能无法记录某些消息,但不会阻塞系统的其余部分。

如果指定的文件名没有转义符,则应计划使用日志轮换 Util 以避免最终填满整个磁盘。在 8.4 之前的版本中,如果不存在%转义符,PostgreSQL 将附加新日志文件创建时间的纪元,但现在不再如此。

如果在log_destination中启用了 CSV 格式输出,则将.csv附加到带时间戳的日志文件名中,以创建 CSV 格式输出的文件名。 (如果log_filename.log结尾,则替换后缀.)

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

默认权限为0600,这意味着只有服务器所有者才能读取或写入日志文件。另一个常用的设置是0640,允许所有者组的成员读取文件。但是请注意,要使用此设置,您需要更改log_directory以将文件存储在群集数据目录之外的某个位置。无论如何,使日志文件具有 Global 可读性是不明智的,因为它们可能包含敏感数据。

此参数只能在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%Mlog_truncate_on_rotation设置为onlog_rotation_age设置为60log_rotation_size设置为1000000。在log_filename中包含%M允许任何可能发生的大小驱动旋转来选择与小时的初始文件名不同的文件名。

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

如果 syslog 最终登录到文本文件,则效果将是相同的,最好保持设置不变,因为大多数 syslog 实现要么无法处理大消息,要么需要进行特殊配置以处理大消息。但是,如果 syslog 最终写入其他某种介质,则可能有必要或更有用的方法将消息逻辑上保持在一起。

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

19 .8.2. 何时登录

对于使用扩展查询协议的 Client 端,“解析”,“绑定”和“执行”步骤的持续时间将独立记录。

Note

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

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

表 19.1. 邮件严重性级别

Severity Usage syslog eventlog
DEBUG1..DEBUG5 提供更多详细信息供开发人员使用。 DEBUG INFORMATION
INFO 提供用户隐式请求的信息,例如VACUUM VERBOSE的输出。 INFO INFORMATION
NOTICE 提供可能对用户有用的信息,例如,长标识符被截断的通知。 NOTICE INFORMATION
WARNING 提供有关可能出现问题的警告,例如,在 Transaction 代码块外的COMMIT NOTICE WARNING
ERROR 报告导致当前命令中止的错误。 WARNING ERROR
LOG 向 Management 员报告感兴趣的信息,例如检查点活动。 INFO INFORMATION
FATAL 报告导致当前会话中止的错误。 ERR ERROR
PANIC 报告导致所有数据库会话中止的错误。 CRIT ERROR

19 .8.3. 要记录什么

Note

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

对于使用扩展查询协议的 Client 端,“解析”,“绑定”和“执行”步骤的持续时间将独立记录。

Note

设置此选项与将log_min_duration_statement设置为零之间的区别是,超过log_min_duration_statement会强制记录查询文本,但不记录该文本。因此,如果log_durationonlog_min_duration_statement具有正值,则记录所有持续时间,但仅对超出阈值的语句包括查询文本。此行为对于收集高负载安装中的统计信息可能很有用。

Escape Effect Session only
%a Application name yes
%u User name yes
%d Database name yes
%r 远程主机名或 IP 地址以及远程端口 yes
%h 远程主机名或 IP 地址 yes
%p Process ID no
%t 没有毫秒的时间戳 no
%m 时间戳(以毫秒为单位) no
%n 以毫秒为单位的时间戳(作为 Unix 时代) no
%i 命令标签:会话当前命令的类型 yes
%e SQLSTATE 错误代码 no
%c 会话 ID:请参见下文 no
%l 每个会话或进程的日志行号,从 1 开始 no
%s 流程开始时间戳 no
%v 虚拟 TransactionID(后端 ID/localXID) no
%x TransactionID(如果未分配,则为 0) no
%q 不产生任何输出,但是告诉非会话进程在字符串中的这一点停止。会话进程忽略 no
%% 字面% no

%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 '

默认值为none。只有超级用户可以更改此设置。

Note

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

19 .8.4. 使用 CSV 格式的日志输出

log_destination列表中包括csvlog提供了一种将日志文件导入数据库表的便捷方法。此选项以逗号分隔值(CSV)格式发出日志行,其中包含以下列:时间戳(毫秒),用户名,数据库名,进程 ID,Client 端主机:端口号,会话 ID,每个会话行号,命令标签,会话开始时间,虚拟事务 ID,常规事务 ID,错误严重性,SQLSTATE 代码,错误消息,错误消息详细信息,提示,导致错误的内部查询(如果有),其中错误位置的字符数,错误上下文,导致错误的用户查询(如果有的话并由log_min_error_statement启用),错误位置的字符数,错误在 PostgreSQL 源代码中的位置(如果log_error_verbosity设置为verbose)以及应用程序名称。这是用于存储 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,
  PRIMARY KEY (session_id, session_line_num)
);

要将日志文件导入此表,请使用COPY FROM命令:

COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;

您需要做一些事情来简化 CSV 日志文件的导入:

19 .8.5. 流程标题

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

上一章 首页 下一章