17.7. 错误报告和日志 #
17.7.1. 日志记录到哪里 #
log_destination(string) #PostgreSQL支持多种把日志记录到不同目的地的方法。在 Windows 上还支持eventlog。默认是只记录到stderr。这个选项以逗号分隔的列表形式设置所需的日志目的地。有效值为stderr和syslog。这个选项可以在服务器启动时或在
postgresql.conf配置文件中设置。redirect_stderr(boolean) #这个选项允许捕获发送到stderr的消息并重定向到日志文件中。这个选项与记录到stderr相结合,通常比记录到syslog更有用,因为某些类型的消息可能不会出现在syslog输出中(一个常见的例子是动态链接器的失败消息)。这个选项只能在服务器启动时设置。
log_directory(string) #当
redirect_stderr被启用时,这个参数决定日志文件将被在哪个目录下创建。它可以被指定为一个绝对路径,也可以被指定为一个相对于集簇数据目录的相对路径。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。log_filename(string) #当启用了
redirect_stderr时,这个选项设置所创建日志文件的文件名。该值会被当作strftime模式处理,因此可以使用%转义来指定随时间变化的文件名。如果没有%转义,PostgreSQL将追加新日志文件开始记录时的纪元时间。例如,如果log_filename是server_log,那么对于 MST 2004 年 8 月 29 日星期日 19:02:33 开始的日志,选定的文件名将是server_log.1093827753。这个选项可以在服务器启动时或在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截断(覆盖而不是追加)任何已有的同名日志文件。不过,截断只在一个新文件由于基于时间的轮转被打开时发生,在服务器启动或基于尺寸的轮转时不会发生。如果被关闭,在所有情况下以前存在的文件将被追加。例如,使用这个设置和一个类似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(string) #当启用了向syslog记录时,这个参数决定要使用的syslog“设施”。你可以在
LOCAL0、LOCAL1、LOCAL2、LOCAL3、LOCAL4、LOCAL5、LOCAL6、LOCAL7中选择,默认值是LOCAL0。还请参阅系统的syslog守护进程的文档。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。除非服务器编译时带有syslog支持,此参数不可用。syslog_ident(string) #当启用了向syslog记录时,这个参数决定用来标识syslog中的PostgreSQL消息的程序名。默认值是
postgres。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。除非服务器编译时带有syslog支持,此参数不可用。
17.7.2. 什么时候记录日志 #
client_min_messages(string) #控制将哪些消息级别发送给客户端。有效值是
DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、LOG、NOTICE、WARNING、ERROR、FATAL、和PANIC。每个级别都包括其后的所有级别。级别越靠后,被发送的消息越少。默认值是NOTICE。注意,LOG在这里的排名与在log_min_messages中不同。log_min_messages(string) #控制将哪些消息级别写入服务器日志。有效值是
DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、LOG、FATAL和PANIC。每个级别都包含它后面的所有级别。级别越靠后,发送到日志的消息越少。默认值是NOTICE。注意,LOG在这里的排名与在client_min_messages中不同。只有超级用户可以更改此设置。log_error_verbosity(string) #控制在服务器日志中记录的每条消息的详细程度。有效值为
TERSE、DEFAULT和VERBOSE,它们依次在显示的消息中增加更多字段。只有超级用户能更改这个设置。log_min_error_statement(string) #控制在服务器日志中记录哪些导致错误条件的SQL语句。对于达到指定严重级别或更高级别的消息,其日志条目中会包含当前 SQL语句。有效值是
DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、FATAL和PANIC。默认值是ERROR,表示导致错误、日志消息、致命错误或恐慌的语句将被记录。要有效地关闭失败语句的记录,可将此参数设置为PANIC。只有超级用户可以更改此设置。log_min_duration_statement(integer) #如果一条已完成语句的运行时间至少达到指定毫秒数,就记录其持续时间。将此值设置为零会打印所有语句的持续时间。负一(默认值)禁用语句持续时间记录。例如,如果设置为
250,则会记录所有运行 250ms 或更长时间的 SQL 语句。启用此参数有助于发现应用中未优化的查询。此设置独立于log_statement和log_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 received”消息重复。此参数只能在
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 语句被记录。有效值是
none(关闭)、ddl、mod和all。ddl记录所有数据定义语句,例如CREATE、ALTER和DROP语句。mod记录所有ddl语句,外加INSERT、UPDATE、DELETE、TRUNCATE和COPY FROM等数据修改语句。如果PREPARE和EXPLAIN ANALYZE包含的命令属于合适的类型,它们也会被记录。默认值为
none。只有超级用户能更改这个设置。注意
EXECUTE语句不被认为是ddl或mod语句。产生语法错误的语句不会被记录。将log_min_error_statement设置为error可以记录这种语句。当函数以PL/pgSQL服务器端语言定义时,该函数执行的查询只在函数于某个特定会话中首次被调用时才会被记录。这是因为PL/pgSQL会为函数中的 SQL 语句所产生的查询计划保留一个缓存。
log_hostname(boolean) #默认情况下,连接日志消息只显示连接主机的 IP 地址。打开这个参数将导致也记录主机名。注意根据你的主机名解析设置,这可能会导致不可忽视的性能开销。这个参数只能在
postgresql.conf文件中或在服务器命令行上设置。