PG中的告警日志配置
Tags: logging_collectorPG参数配置告警日志错误日志
简介
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.xmmup.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
)本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!设置在服务器日志中写入的时间戳的时区。和TimeZone不同,这个值是集簇范围的,因此所有会话将报告一致的时间戳。内建默认值是
GMT
,但是通常会被在postgresql.conf
中覆盖。initdb将安装一个对应于其系统环境的设置。详见第 8.5.3 节。这个参数只能在postgresql.conf
文件中或在服务器命令行上设置。
使用 CSV 格式的日志输出
在log_destination
列表中包括csvlog
提供了一种便捷方式将日志文件导入到一个数据库表。这个选项发出逗号分隔值(CSV)格式的日志行,包括这些列: 带毫秒的时间戳、 用户名、 数据库名、 进程 ID、 客户端主机:端口号、 会话 ID、 每个会话的行号、 命令标签、 会话开始时间、 虚拟事务 ID、 普通事务 ID、 错误严重性、 SQLSTATE 代码、 错误消息、 错误消息详情、 提示、 导致错误的内部查询(如果有)、 错误位置所在的字符计数、 错误上下文、 导致错误的用户查询(如果有且被log_min_error_statement
启用)、 错误位置所在的字符计数、 在 PostgreSQL 源代码中错误的位置(如果log_error_verbosity
被设置为verbose
)以及应用名和后端类型。 下面是一个定义用来存储 CSV 格式日志输出的样表:
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 | 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, PRIMARY KEY (session_id, session_line_num) ); |
It is also possible to access the file as a foreign table, using the supplied file_fdw module.
使用COPY FROM
命令将一个日志文件导入到这个表中:
1 | 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
失败。
进程标题
这些设置控制服务器进程的进程标题如何被修改。进程标题通常可以用ps或者 Windows 上的进程浏览器等程序来查看。详见第 27.1 节。
cluster_name
(string
)为不同目的设置标识这个数据库集群(实例)的名称。此集群名称出现在该集群中所有服务器进程的进程标题中。 此外,它还是备用连接的默认应用名称。(参见 synchronous_standby_names.)这个名称可以是任何长度不超过
NAMEDATALEN
个字符(在标准编译中是 64字符)的任何字符串。只有可打印的 ASCII 字符能被用在cluster_name
值中。其他字符将被替换为问号(?
)。如果这个参数被设置为空字符串''
(也是默认值),将不会显示名称。这个参数只能在服务器启动时设置。update_process_title
(boolean
)启用进程标题更新,每次服务器接收到一个新的 SQL 命令时都更新进程标题。在大部分平台上这个设置默认为
on
,但是由于 Windows 上更新进程标题的开销更大,所以在 Windows 这个设置默认为off
。只有超级用户能更改这个设置。
常见配置
1.logging_collector = on/off ---- 是否将日志重定向至文件中,默认是off(该配置修改后,需要重启DB服务)
DB安装完成,启动的服务进程如下
1 2 3 4 5 6 7 | [root@localhost ~]# ps -elf | grep postgres 0 S postgres 2385 1 0 80 0 - 66829 poll_s 12:41 ? 00:00:00 /opt/pg9.6/bin/postgres -D /mnt/pgdata 1 S postgres 2387 2385 0 80 0 - 66829 ep_pol 12:41 ? 00:00:00 postgres: checkpointer process 1 S postgres 2388 2385 0 80 0 - 66829 ep_pol 12:41 ? 00:00:00 postgres: writer process 1 S postgres 2389 2385 0 80 0 - 66870 ep_pol 12:41 ? 00:00:00 postgres: wal writer process 1 S postgres 2390 2385 0 80 0 - 66952 ep_pol 12:41 ? 00:00:00 postgres: autovacuum launcher process 1 S postgres 2391 2385 0 80 0 - 29643 ep_pol 12:41 ? 00:00:00 postgres: stats collector process |
将此配置修改为on,并重启DB服务,DB启动过程中会提示将日志重定向${PGDATA}/pg_log中。
1 2 3 4 | [root@localhost ~]# su -l postgres -c '/opt/pg9.6/bin/pg_ctl -D /mnt/pgdata start' server starting LOG: redirecting log output to logging collector process HINT: Future log output will appear in directory "pg_log". |
此时在运行的进程如下,与之前相比,多了一个logger进程。
1 2 3 4 5 6 7 8 | [root@localhost ~]# ps -elf | grep postgres 0 S postgres 2448 1 0 80 0 - 66830 poll_s 12:50 ? 00:00:00 /opt/pg9.6/bin/postgres -D /mnt/pgdata 1 S postgres 2449 2448 0 80 0 - 29645 ep_pol 12:50 ? 00:00:00 postgres: logger process 1 S postgres 2451 2448 0 80 0 - 66830 ep_pol 12:50 ? 00:00:00 postgres: checkpointer process 1 S postgres 2452 2448 0 80 0 - 66830 ep_pol 12:50 ? 00:00:00 postgres: writer process 1 S postgres 2453 2448 0 80 0 - 66871 ep_pol 12:50 ? 00:00:00 postgres: wal writer process 1 S postgres 2454 2448 0 80 0 - 66953 ep_pol 12:50 ? 00:00:00 postgres: autovacuum launcher process 1 S postgres 2455 2448 0 80 0 - 29644 ep_pol 12:50 ? 00:00:00 postgres: stats collector process |
以下配置修改不需要重启服务,只需重载配置
1 | [root@localhost ~]# su -l postgres -c '/opt/pg9.6/bin/pg_ctl -D /mnt/pgdata reload' |
2.log_directory = 'pg_log' ---- 日志文件目录,默认是PGDATA的相对路径,即PGDATA的相对路径,即{PGDATA}/pg_log,也可以改为绝对路径
默认为${PGDATA}/pg_log,即集群目录下,但是日志文件可能会非常多,建议将日志重定向到其他目录或分区。
将此配置修改为/var/log/pg_log下,必须先创建此目录,并修改权限,如
1 2 3 | [root@localhost ~]# mkdir -p /var/log/pg_log [root@localhost ~]# chown postgres:postgres /var/log/pg_log/ [root@localhost ~]# chmod 700 /var/log/pg_log/ |
重启DB服务后,日志将重定向至/var/log/pg_log下
1 2 3 4 5 6 7 | [root@localhost ~]# su -l postgres -c '/opt/pg9.6/bin/pg_ctl -D /mnt/pgdata start' server starting LOG: redirecting log output to logging collector process HINT: Future log output will appear in directory "/var/log/pg_log". [root@localhost ~]# ls /var/log/pg_log/ postgresql-2016-06-18_130611.log |
3.logfilename = 'postgresql-%Y-%m-%d%H%M%S.log' ---- 日志文件命名形式,使用默认即可
4.log_rotation_age = 1d ---- 单个日志文件的生存期,默认1天,在日志文件大小没有达到log_rotation_size时,一天只生成一个日志文件
5.log_rotation_size = 10MB ---- 单个日志文件的大小,如果时间没有超过log_rotation_age,一个日志文件最大只能到10M,否则将新生成一个日志文件。
6.log_truncate_on_rotation = off ---- 当日志文件已存在时,该配置如果为off,新生成的日志将在文件尾部追加,如果为on,则会覆盖原来的日志。
7.log_lock_waits = off ---- 控制当一个会话等待时间超过deadlock_timeout而被锁时是否产生一个日志信息。在判断一个锁等待是否会影响性能时是有用的,缺省是off。
8.log_statement = 'none' # none, ddl, mod, all ---- 控制记录哪些SQL语句。none不记录,ddl记录所有数据定义命令,比如CREATE,ALTER,和DROP 语句。mod记录所有ddl语句,加上数据修改语句INSERT,UPDATE等,all记录所有执行的语句,将此配置设置为all可跟踪整个数据库执行的SQL语句。
9.log_duration = off ---- 记录每条SQL语句执行完成消耗的时间,将此配置设置为on,用于统计哪些SQL语句耗时较长。
10.log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements and their durations, > 0 logs only statements running at least this number of milliseconds
-1表示不可用,0将记录所有SQL语句和它们的耗时,>0只记录那些耗时超过(或等于)这个值(ms)的SQL语句。个人更喜欢使用该配置来跟踪那些耗时较长,可能存在性能问题的SQL语句。虽然使用log_statement和log_duration也能够统计SQL语句及耗时,但是SQL语句和耗时统计结果可能相差很多行,或在不同的文件中,但是log_min_duration_statement会将SQL语句和耗时在同一行记录,更方便阅读。
11.log_connections = off ----是否记录连接日志
12.log_disconnections = off ---- 是否记录连接断开日志
13.log_line_prefix = '%m %p %u %d %r ' ---- 日志输出格式(%m,%p实际意义配置文件中有解释),可根据自己需要设置(能够记录时间,用户名称,数据库名称,客户端IP和端口,方便定位问题)
14.log_timezone = 'Asia/Shanghai' ---- 日志时区,最好和服务器设置同一个时区,方便问题定位
服务器时区设置
1 | [root@localhost ~]# cp -rf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |