合 PG中的告警日志配置介绍
Tags: PGPostgreSQL整理自官网告警日志错误日志log_destination
简介
pg_log表示数据库运行日志,也叫log日志,pg_log默认是关闭的,需要配置postgresql.conf相关的参数启用此日志,默认路径$PGDATA/log/;记录各种Error信息,定位慢查询SQL,数据库的启动关闭信息,发生checkpoint过于频繁等的告警信息。
常见配置:
1 2 3 4 5 6 | logging_collector = on log_directory = 'pg_log' log_filename = 'postgresql-%a.log' log_truncate_on_rotation = on select * from pg_settings where name in ('logging_collector','log_directory','log_filename','log_truncate_on_rotation'); |
配置“logging_collector = on”需要重启数据库。
pg_rotate_logfile()通知告警日志文件管理器立即切换到一个新的输出文件。 这仅在内置日志采集器运行时有效,因为否则没有日志文件管理器子进程。有关告警日志参考:https://www.dbaup.com/pgzhongdegaojingrizhipeizhi.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | postgres=# select pg_rotate_logfile(); WARNING: rotation not possible because log collection not active pg_rotate_logfile ------------------- f (1 row) postgres=# select * from pg_settings where name in ('logging_collector','log_directory','log_filename','log_truncate_on_rotation'); name | setting | unit | category | short_desc | extra_desc | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | sourcefile | sourceline | pending_restart --------------------------+--------------------------------+------+--------------------------------------+----------------------------------------------------------------------------+-------------------------------------------------------------------------+------------+---------+---------+---------+---------+----------+--------------------------------+--------------------------------+------------+------------+----------------- log_directory | log | | Reporting and Logging / Where to Log | Sets the destination directory for log files. | Can be specified as relative to the data directory or as absolute path. | sighup | string | default | | | | log | log | | | f log_filename | postgresql-%Y-%m-%d_%H%M%S.log | | Reporting and Logging / Where to Log | Sets the file name pattern for log files. | | sighup | string | default | | | | postgresql-%Y-%m-%d_%H%M%S.log | postgresql-%Y-%m-%d_%H%M%S.log | | | f log_truncate_on_rotation | off | | Reporting and Logging / Where to Log | Truncate existing log files of same name during log rotation. | | sighup | bool | default | | | | off | off | | | f logging_collector | off | | Reporting and Logging / Where to Log | Start a subprocess to capture stderr output and/or csvlogs into log files. | | postmaster | bool | default | | | | off | off | | | f (4 rows) postgres=# alter system set logging_collector = on; ALTER SYSTEM postgres=# select * from pg_settings where name in ('logging_collector','log_directory','log_filename','log_truncate_on_rotation'); name | setting | unit | category | short_desc | extra_desc | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | sourcefile | sourceline | pending_restart --------------------------+--------------------------------+------+--------------------------------------+----------------------------------------------------------------------------+-------------------------------------------------------------------------+------------+---------+---------+---------+---------+----------+--------------------------------+--------------------------------+------------+------------+----------------- log_directory | log | | Reporting and Logging / Where to Log | Sets the destination directory for log files. | Can be specified as relative to the data directory or as absolute path. | sighup | string | default | | | | log | log | | | f log_filename | postgresql-%Y-%m-%d_%H%M%S.log | | Reporting and Logging / Where to Log | Sets the file name pattern for log files. | | sighup | string | default | | | | postgresql-%Y-%m-%d_%H%M%S.log | postgresql-%Y-%m-%d_%H%M%S.log | | | f log_truncate_on_rotation | off | | Reporting and Logging / Where to Log | Truncate existing log files of same name during log rotation. | | sighup | bool | default | | | | off | off | | | f logging_collector | off | | Reporting and Logging / Where to Log | Start a subprocess to capture stderr output and/or csvlogs into log files. | | postmaster | bool | default | | | | off | off | | | f (4 rows) postgres=# select pg_reload_conf(); pg_reload_conf ---------------- t (1 row) postgres=# select * from pg_settings where name in ('logging_collector','log_directory','log_filename','log_truncate_on_rotation'); name | setting | unit | category | short_desc | extra_desc | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | sourcefile | sourceline | pending_restart --------------------------+--------------------------------+------+--------------------------------------+----------------------------------------------------------------------------+-------------------------------------------------------------------------+------------+---------+---------+---------+---------+----------+--------------------------------+--------------------------------+------------+------------+----------------- log_directory | log | | Reporting and Logging / Where to Log | Sets the destination directory for log files. | Can be specified as relative to the data directory or as absolute path. | sighup | string | default | | | | log | log | | | f log_filename | postgresql-%Y-%m-%d_%H%M%S.log | | Reporting and Logging / Where to Log | Sets the file name pattern for log files. | | sighup | string | default | | | | postgresql-%Y-%m-%d_%H%M%S.log | postgresql-%Y-%m-%d_%H%M%S.log | | | f log_truncate_on_rotation | off | | Reporting and Logging / Where to Log | Truncate existing log files of same name during log rotation. | | sighup | bool | default | | | | off | off | | | f logging_collector | off | | Reporting and Logging / Where to Log | Start a subprocess to capture stderr output and/or csvlogs into log files. | | postmaster | bool | default | | | | off | off | | | t (4 rows) postgres=# select pg_rotate_logfile(); WARNING: rotation not possible because log collection not active pg_rotate_logfile ------------------- f (1 row) -- 需要重启数据库 postgres=# select pg_rotate_logfile(); FATAL: terminating connection due to administrator command server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. The connection to the server was lost. Attempting reset: Succeeded. psql (13.3, server 13.4 (Debian 13.4-1.pgdg100+1)) postgres=# select * from pg_settings where name in ('logging_collector','log_directory','log_filename','log_truncate_on_rotation'); name | setting | unit | category | short_desc | extra_desc | context | vartype | source | min_val | max_val | enumvals | boot_val | reset_val | sourcefile | sourceline | pending_restart --------------------------+--------------------------------+------+--------------------------------------+----------------------------------------------------------------------------+-------------------------------------------------------------------------+------------+---------+--------------------+---------+---------+----------+--------------------------------+--------------------------------+-----------------------------------------------+------------+----------------- log_directory | log | | Reporting and Logging / Where to Log | Sets the destination directory for log files. | Can be specified as relative to the data directory or as absolute path. | sighup | string | default | | | | log | log | | | f log_filename | postgresql-%Y-%m-%d_%H%M%S.log | | Reporting and Logging / Where to Log | Sets the file name pattern for log files. | | sighup | string | default | | | | postgresql-%Y-%m-%d_%H%M%S.log | postgresql-%Y-%m-%d_%H%M%S.log | | | f log_truncate_on_rotation | off | | Reporting and Logging / Where to Log | Truncate existing log files of same name during log rotation. | | sighup | bool | default | | | | off | off | | | f logging_collector | on | | Reporting and Logging / Where to Log | Start a subprocess to capture stderr output and/or csvlogs into log files. | | postmaster | bool | configuration file | | | | off | on | /var/lib/postgresql/data/postgresql.auto.conf | 3 | f (4 rows) postgres=# select pg_rotate_logfile(); pg_rotate_logfile ------------------- t (1 row) -- 每执行一次pg_rotate_logfile,就会重新生成一个log文件 root@lhrpg134:/var/lib/postgresql/data/log# ls -l total 4 -rw------- 1 postgres postgres 605 Sep 23 10:54 postgresql-2021-09-23_105404.log -rw------- 1 postgres postgres 0 Sep 23 10:54 postgresql-2021-09-23_105424.log root@lhrpg134:/var/lib/postgresql/data/log# ls -l total 4 -rw------- 1 postgres postgres 605 Sep 23 10:54 postgresql-2021-09-23_105404.log -rw------- 1 postgres postgres 0 Sep 23 10:54 postgresql-2021-09-23_105424.log -rw------- 1 postgres postgres 0 Sep 23 10:59 postgresql-2021-09-23_105924.log |
参数介绍
在哪里做日志
log_destination
(string
)PostgreSQL支持多种方法来记录服务器消息,包括stderr、csvlog和syslog。在 Windows 上还支持eventlog。设置这个参数为一个由想要的日志目的地的列表,之间用逗号分隔。默认值是只记录到stderr。这个参数只能在
postgresql.conf
文件中或在服务器命令行上设置。如果csvlog被包括在log_destination
中,日志项会以“逗号分隔值” (CSV)格式被输出,这样可以很方便地把日志载入到程序中。详见第 19.8.4 节。要产生 CSV 格式的日志输出,必须启用logging_collector。当包括有stderr或csvlog时,会创建文件current_logfiles
来记录当前正在被日志收集器使用的日志文件的位置以及相关的日志目的地。这提供了一种查找实例当前使用的日志的便利手段。这里是该文件内容的一个例子:stderr log/postgresql.log csvlog log/postgresql.csv
当由于轮转效应创建一个新的日志文件时以及log_destination
被重载时,current_logfiles
文件会被重建。当log_destination
中不包括stderr和csvlog时以及当日志收集器被禁用时,这个文件会被删除。注意在大多数 Unix 系统上,你将需要修改系统的syslog守护进程的配置来使用log_destination
的syslog选项。PostgreSQL可以在syslog设备LOCAL0
到LOCAL7
中记录(见syslog_facility),但是大部分平台上的默认syslog配置会丢弃所有这种消息。你将需要增加这样的内容:local0.* /var/log/postgresql
到syslog守护进程的配置文件来让它工作。在 Windows 上,当你使用log_destination
的eventlog
选项时,你应该在操作系统中注册一个事件源极其库,这样 Windows 事件查看器能够清楚地显示事件日志消息。详见第 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指定的时区中完成)。 被支持的%
转义和开放组织的strftime说明中列举的类似。 注意系统的strftime
不会被直接使用,因此平台相关(非标准)的扩展无法工作。 默认是postgresql-%Y-%m-%d_%H%M%S.log
。如果你不使用转义来指定一个文件名,你应该计划使用一个日志轮转工具来避免最终填满整个磁盘。在 8.4 发行之前,如果不存在%
转义,PostgreSQL将追加新日志文件创建时间的纪元,但是现在已经不再这样做了。如果在log_destination
中启用了 CSV 格式输出,.csv
将会被追加到时间戳日志文件名中来创建 CSV 格式输出(如果log_filename
以.log
结尾,该后缀会被替换)。这个参数只能在postgresql.conf
文件中或在服务器命令行上设置。log_file_mode
(integer
)在 Unix 系统上,当
logging_collector
被启用时,这个参数设置日志文件的权限(在微软 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并且这个设置为 on (默认)时,每一个消息会被加上一个增长的序号作为前缀(例如
[2]
)。这种行为避开了很多 syslog 实现默认采用的“--- 上一个消息重复 N 次 ---”形式。在现代 syslog 实现中,抑制重复消息是可以配置的(例如rsyslog中的$RepeatedMsgReduction
),因此这个参数可能不是必需的。此外,如果你真的想抑制重复消息,你可以把这个参数设置为 off。这个参数只能在postgresql.conf
文件或者服务器命令行上设置。syslog_split_messages
(boolean
)当启用把日志记录到syslog时,这个参数决定消息如何送达 syslog。当设置为 on(默认)时,消息会被分成行,并且长的行也会被划分以便能够放到 1024 字节中,这是传统 syslog 实现一种典型的尺寸限制。当设置为 off 时,PostgreSQL 服务器日志消息会被原样送达 syslog 服务,而处理可能的大体量消息的任务由 syslog 服务负责。如果 syslog 最终被记录到一个文本文件中,那么两种设置的效果是一样的,但最好设置为 on,因为大部分 syslog 实现要么不能处理大型消息,要么需要做特殊的配置以处理大型消息。但是如果 syslog 最终写入到某种其他媒介,有必要让消息保持逻辑上的整体性(也更加有用)。这个参数只能在
postgresql.conf
文件或者服务器命令行上设置。event_source
(string
)当启用了向事件日志记录时,这个参数决定用来标识日志中PostgreSQL消息的程序名。默认值是
PostgreSQL
。这个参数只能在postgresql.conf
文件中或在服务器命令行上设置。
什么时候记录日志
log_min_messages
(enum
)控制哪些消息级别 被写入到服务器日志。有效值是
DEBUG5
、DEBUG4
、DEBUG3
、DEBUG2
、DEBUG1
、INFO
、NOTICE
、WARNING
、ERROR
、LOG
、FATAL
和PANIC
。每个级别都包括以后的所有级别。级别越靠后,被发送的消息越少。默认值是WARNING
。注意LOG
在这里有与client_min_messages中不同的排名。只有超级用户可以改变这个设置。log_min_error_statement
(enum
)控制哪些导致一个错误情况的 SQL 语句被记录在服务器日志中。任何指定 严重级别 或更高级别的消息的当前 SQL 语句将被包括在日志项中。有效值是
DEBUG5
、DEBUG4
、DEBUG3
、DEBUG2
、DEBUG1
、INFO
、NOTICE
、WARNING
、ERROR
、LOG
、FATAL
和PANIC
。默认值是ERROR
,它表示导致错误、日志消息、致命错误或恐慌错误的语句将被记录在日志中。要有效地关闭记录失败语句,将这个参数设置为PANIC
。只有超级用户可以改变这个设置。log_min_duration_statement
(integer
)如果语句运行至少指定的时间量,将导致记录每一个这种完成的语句的持续时间。 例如,如果你设置它为
250ms
,那么所有运行 250ms 或更久的 SQL 语句将被记录。 启用这个参数可以有助于追踪应用中未优化的查询。如果指定值时没有单位,则以毫秒为单位。将这个参数设置为零将打印所有语句的执行时间。 设置为-1
(默认值)将停止记录语句持续时间。只有超级用户可以改变这个设置。这会覆盖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
(默认值)禁用采样语句持续时间。只有超级用户可以更改此设置。此设置的优先级低于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/2的概率将被记录。 默认值为1.0
,意味着要记录所有采样语句。 设置为零将禁用采样语句持续时间日志,与将log_min_duration_sample
设为-1
相同。 只有超级用户可以更改此设置。log_transaction_sample_rate
(floating point
)设置所有语句都被记录的交易的部分,以及由于其他原因而记录的语句。它适用于每个新事务,而不考虑其语句的持续时间。 采样是随机的,例如
0.1
意味着从统计学上讲,任何给定事务都有十分之一的机会将被记录。log_transaction_sample_rate
有助于构建一个事务示例. 默认值为0
,表示不记录任何额外事务的语句。 设置这个为1
将记录所有交易的所有语句。只有超级用户可以更改此设置。注意就像所有的语句-日志选项一样,这个选项可能会增加大量开销。
表 19.2解释了PostgreSQL所使用的消息严重级别。如果日志输出被发送到syslog或 Windows 的eventlog,严重级别会按照表中所示进行转换。
表 19.2. 消息严重级别
严重性 | 用法 | 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 |
记录什么到日志
application_name
(string
)application_name
可以是任意小于NAMEDATALEN
个字符(标准编译中是 64 个字符)的字符串。这通常由一个应用通过到服务器的连接设置。该名称将被显示在pg_stat_activity
视图中并被包括在 CSV 日志项中。它也会被通过log_line_prefix包括在普通日志项中。只有可打印 ASCII 字符能被使用在application_name
之中。其他字符将被替换为问号(?
)。debug_print_parse
(boolean
)debug_print_rewritten
(boolean
)debug_print_plan
(boolean
)这个参数启用发出各种调试输出。当设置时,会打印生成的解析树, 查询重写输出,或执行的每个查询的执行计划。这些信息是在LOG 信息级别发出,因此默认的,它们会出现在服务器日志中,但不会发送给客户端。 可以通过 client_min_messages和/或log_min_messages 来设置。这些参数缺省是off。 这些参数将会让多种调试输出被发出。当被设置时,它们为每一个被执行的查询打印结果分析树、查询重写器输出或执行计划。这些消息在
LOG
消息级别上被发出,因此默认情况下它们将出现在服务器日志中但不会被发送到客户端。你可以通过调整client_min_messages和/或log_min_messages来改变这种情况。这些参数默认是关闭的。debug_pretty_print
(boolean
)当被设置时,
debug_pretty_print
会缩进由debug_print_parse
、debug_print_rewritten
或debug_print_plan
产生的输出。这将导致比关闭参数时使用的“紧凑”模式可读性更强但是更长的输出。它默认是打开的。log_checkpoints
(boolean
)导致检查点和重启点被记录在服务器日志中。一些统计信息也被包括在日志消息中,包括写入缓冲区的数据和写它们所花的时间。这个参数只能在
postgresql.conf
文件中或在服务器命令行上设置。默认值是关闭。log_connections
(boolean
)导致每一次尝试对服务器的连接被记录,客户端认证的成功完成也会被记录。 只有超级用户能在会话开始时更改这个参数,在会话中它不能被更改。默认 为
off
。注意某些客户端程序(例如psql)在要求密码时会尝试连接两次,因此重复的“收到连接”消息并不一定表示一个错误。log_disconnections
(boolean
)导致会话终止被记录。日志输出提供的信息类似于
log_connections
,不过还外加会话的持续时间。 只有超级用户能在会话开始时更改这个参数,在会话中它不能被更改。默认 为off
。log_duration
(boolean
)导致每一个完成的语句的持续时间被记录。默认值是
off
。只有超级用户可以改变这个设置。对于使用扩展查询协议的客户端,解析、绑定和执行步骤的持续时间将被独立记录。注意启用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)以及产生错误的源代码文件名、函数名和行号。只有超级用户能够更改这个设置。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否%t
无毫秒的时间戳否%m
带毫秒的时间戳否%n
带毫秒的时间戳(作为 Unix 时代)no%i
命令标签:会话当前命令的类型是%e
SQLSTATE 错误代码否%c
会话 ID:见下文否%l
对每个会话或进程的日志行号,从 1 开始否%s
进程开始的时间戳否%v
虚拟事务 ID (backendID/localXID)否%x
事务 ID (如果未分配则为 0)否%q
不产生输出,但是告诉非会话进程在字符串的这一点停止;会话进程忽略否%%
纯文字%
否后端类型对应视图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 '
这个参数只能在
postgresql.conf
文件中或在服务器命令行上设置。默认值是'%m [%p] '
,它记录时间戳和进程ID。转义 效果 只限会话 %a
应用名 是 %u
用户名 是 %d
数据库名 是 %r
远程主机名或 IP 地址,以及远程端口 是 %h
远程主机名或 IP 地址 是 %b
后端类型 否 %p
进程 ID 否 %t
无毫秒的时间戳 否 %m
带毫秒的时间戳 否 %n
带毫秒的时间戳(作为 Unix 时代) no %i
命令标签:会话当前命令的类型 是 %e
SQLSTATE 错误代码 否 %c
会话 ID:见下文 否 %l
对每个会话或进程的日志行号,从 1 开始 否 %s
进程开始的时间戳 否 %v
虚拟事务 ID (backendID/localXID) 否 %x
事务 ID (如果未分配则为 0) 否 %q
不产生输出,但是告诉非会话进程在字符串的这一点停止;会话进程忽略 否 %%
纯文字 %
否 后端类型对应视图
pg_stat_activity
中的backend_type
列。 但是其他类型可能会出现在日志中而不显示在该视图中。%c
转义打印一个准唯一的会话标识符,它由两个 4 字节的十六进制数(不带先导零)组成,以点号分隔。 这些数字是进程启动时间和进程 ID,因此%c
也可以被用作保存打印这些项的方式的空间。 例如,要从pg_stat_activity
生成会话标识符,使用这个查询:123SELECT to_hex(trunc(EXTRACT(EPOCH FROM backend_start))::integer) || '.' ||to_hex(pid)FROM pg_stat_activity;
如果你为log_line_prefix
设置了非空值,你通常应该让它的最后一个字符为空格,这样用以提供和日志行的剩余部分的视觉区别。也可以使用标点符号。
Syslog产生自己的时间戳和进程 ID 信息,因此如果你记录到syslog你可能不希望包括哪些转义。
在包括仅在会话(后端)上下文中可用的信息(如用户名或者数据库名)时,%q
转义很有用。例如:
1 | log_line_prefix = '%m [%p] %q%u@%d/%a ' |
log_lock_waits
(boolean
)控制当一个会话为获得一个锁等到超过deadlock_timeout时,是否要产生一个日志消息。这有助于决定是否所等待造成了性能低下。默认值是
off
。只有超级用户可以更改这个设置。log_parameter_max_length
(integer
)如果大于零,则使用非错误语句日志消息记录的每个绑定参数值都被裁剪为这么多字节。 零禁用非错误语句日志的绑定参数日志。
-1
(默认值)允许绑定参数被完整登录。 如果指定此值时没有单位,则将其作为字节。只有超级用户可以更改此设置。此设置仅影响作为结果打印的日志消息log_statement,log_duration, 和相关的设置。 该设置的非零值会增加一些开销,特别是当参数以二进制形式发送时,因为需要转换为文本。log_parameter_max_length_on_error
(integer
)如果大于零,则错误消息中报告的每个绑定参数值都将裁剪为这么多字节。 零(默认值)禁止在错误消息中包含绑定参数。
-1
允许打印完整绑定参数。 如果指定此值时没有单位,则将其作为字节。该设置的非零值会增加开销,由于PostgreSQL需要在每条语句的开始处将参数值的文本表示存储在内存中,无论最终是否会发生错误。 当绑定参数以二进制形式发送时,开销比以文本形式发送时更大,因为前者需要数据转换,而后者只需要复制字符串。log_statement
(enum
)控制哪些 SQL 语句被记录。有效值是
none
(off)、ddl
、mod
和all
(所有语句)。ddl
记录所有数据定义语句,例如CREATE
、ALTER
和DROP
语句。mod
记录所有ddl
语句,外加数据修改语句例如INSERT
,UPDATE
、DELETE
、TRUNCATE
, 和COPY FROM
。 如果PREPARE
、EXECUTE
和EXPLAIN ANALYZE
包含合适类型的命令,它们也会被记录。对于使用扩展查询协议的客户端,当收到一个执行消息时会产生日志并且会包括绑定参数的值(任何内嵌的单引号会被双写)。默认值是none
。只有超级用户可以改变这个设置。注意即使使用log_statement
=all
设置,包含简单语法错误的语句也不会被记录。这是因为只有在完成基本语法解析并确定了语句类型之后才会发出日志消息。在扩展查询协议的情况下,在执行阶段之前(即在解析分析或规划期间)出错的语句也不会被记录。将log_min_error_statement
设置为ERROR
(或更低)来记录这种语句。log_replication_commands
(boolean
)导致每一个复制命令都被记录在服务器日志中。关于复制命令的详细信息请见 第 52.4 节。默认值是
off
。只有 超级用户可以更改这个设置。log_temp_files
(integer
)控制记录临时文件名和尺寸。临时文件可以被创建用来排序、哈希和存储临时查询结果。 如果启用这个设置,当每一个临时文件被删除时都会产生一个日志项。 一个零值记录所有临时文件信息,而正值只记录尺寸大于或等于指定数据量的文件。如果指定值时没有单位,则以千字节为单位。默认设置为 -1,它禁用这种记录。只有超级用户可以更改这个设置。
log_timezone
(string
)设置在服务器日志中写入的时间戳的时区。和TimeZone不同,这个值是集簇范围的,因此所有会话将报告一致的时间戳。内建默认值是
GMT
,但是通常会被在postgresql.conf
中覆盖。initdb将安装一个对应于其系统环境的设置。详见第 8.5.3 节。这个参数只能在postgresql.conf
文件中或在服务器命令行上设置。
PG 15中的错误日志参数介绍
http://postgres.cn/docs/15/runtime-config-logging.html
20.8.1. 在哪里做日志
log_destination
(string
)PostgreSQL支持多种记录服务器消息的方法,包括 stderr,csvlog, jsonlog和 syslog。在Windows上, eventlog也受支持。将此参数设置为以逗号分隔的所需日志目的地列表。默认情况下仅记录到 stderr。 此参数只能在
postgresql.conf
文件或服务器命令行中设置。如果csvlog被包括在log_destination
中,日志项会以“逗号分隔值” (CSV)格式被输出,这样可以很方便地把日志载入到程序中。详见第 20.8.4 节。要产生 CSV 格式的日志输出,必须启用logging_collector。如果jsonlog包含在log_destination
中, 日志条目将以JSON格式输出,这对将日志加载到程序中很方便。 有关详细信息,请参见第 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可以在syslog设备LOCAL0
到LOCAL7
中记录(见syslog_facility),但是大部分平台上的默认syslog配置会丢弃所有这种消息。你将需要增加这样的内容:local0.* /var/log/postgresql
到syslog守护进程的配置文件来让它工作。在 Windows 上,当你使用log_destination
的eventlog
选项时,你应该在操作系统中注册一个事件源极其库,这样 Windows 事件查看器能够清楚地显示事件日志消息。详见第 19.12 节。logging_collector
(boolean
)这个参数启用日志收集器,它是一个捕捉被发送到stderr的日志消息的后台进程,并且它会将这些消息重定向到日志文件中。这种方法比记录到syslog通常更有用,因为某些类型的消息不会在syslog输出中出现(一个常见的例子是动态链接器错误消息;另一个例子是由
archive_command
等脚本产生的错误消息)。这个参数只能在服务器启动时设置。注意也可以不使用日志收集器而把日志记录到stderr,日志消息将只会去到服务器的stderr被定向到的位置。不过,那种方法只适合于低日志量,因为它没有提供方法来轮转日志文件。还有,在某些不使用日志收集器的平台上可能会导致丢失或者混淆日志输出,因为多个进程并发写入同一个日志文件时会覆盖彼此的输出。注意日志收集器被设计成从来不会丢失消息。这意味着在极高的负载下,如果服务器进程试图在收集器已经落后时发送更多的日志消息,那么它会被阻塞。相反,syslog倾向于在无法写入消息时丢掉消息,这意味着在这样的情况下它可能会无法记录某些消息,但是它不会阻塞系统的其他部分。log_directory
(string
)当
logging_collector
被启用时,这个参数决定日志文件将被在哪个目录下创建。它可以被指定为一个绝对路径,也可以被指定为一个相对于集簇数据目录的相对路径。这个参数只能在postgresql.conf
文件中或在服务器命令行上设置。 默认是log
。本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!