日志架构
日志路径
路径 | 描述 |
---|---|
/home/gpadmin/gpadminlogs/* | 很多不同种类的日志文件,每台服务器都有的目录 |
/home/gpadmin/gpadminlogs/gpstart_%Y%m%d.log | 启动日志 |
/home/gpadmin/gpadminlogs/gpstop_%Y%m%d.log | 停止日志 |
/home/gpadmin/gpadminlogs/gpsegstart.py_idb*gpadmin_%Y%m%d.log | Segment启动日志 |
/home/gpadmin/gpadminlogs/gpsegstop.py_idb*gpadmin_%Y%m%d.log | Segment停止日志 |
${GPDATA_HOME}/master/gpseg-1/pg_log/startup.log | 实例启动日志 |
${GPDATA_HOME}/master/gpseg-1/gpperfmon/logs/gpmon.*.log | gpperfmon日志 |
${GPDATA_HOME}/mirror/gpseg1/pg_log/*.csv | 镜像Segment日志 |
${GPDATA_HOME}/primary/gpseg2/pg_log/*.csv | 主Segment日志 |
/home/log/messages | 全局Linux系统消息 |
日志文件格式
-
服务器日志文件被写为逗号分隔值(CSV)格式。
-
不是所有的日志项在所有的日志域中都有值,例如,只有与查询工作者进程相关的日志项才会有slice_id值。
-
一个特定查询的相关日志项可以通过其会话标识符(gp_session_id)和命令标识符(gp_command_count)确定。
序号 | 域名 | 数据类型 | 描述 |
---|---|---|---|
1 | event_time | timestamp with time zone | 日志项被写到日志中的时间 |
2 | user_name | varchar(100) | 数据库用户名 |
3 | database_name | varchar(100) | 数据库名 |
4 | process_id | varchar(10) | 系统进程ID(带前缀“p”) |
5 | thread_id | varchar(50) | 线程计数(带前缀“th”) |
6 | remote_host | varchar(100) | 在Master上,是客户端机器的主机名/地址。在Segment上,是Master的主机名/地址。 |
7 | remote_port | varchar(10) | Segment或Master的端口号 |
8 | session_start_time | timestamp with time zone | 会话连接打开的时间 |
9 | transaction_id | int | Master上的顶层事务ID。这个ID是任何子事务的父亲。 |
10 | gp_session_id | text | 会话标识符号(带前缀“con”) |
11 | gp_command_count | text | 会话内部的命令编号(带前缀“cmd”) |
12 | gp_segment | text | Segment内容标识符(对主Segment带前缀“seg”,镜像Segment带前缀“mir”)。Master的内容id总是-1。 |
13 | slice_id | text | 切片id(查询计划被执行的部分) |
14 | distr_tranx_id | text | 分布式事务ID |
15 | local_tranx_id | text | 本地事务ID |
16 | sub_tranx_id | text | 子事务ID |
17 | event_severity | varchar(10) | 值包括:LOG、ERROR、FATAL、PANIC、DEBUG1、DEBUG2 |
18 | sql_state_code | varchar(10) | 与日志消息相关的SQL状态代码 |
19 | event_message | text | 日志或者错误消息文本 |
20 | event_detail | text | 与错误或者警告消息相关的详细消息文本 |
21 | event_hint | text | 与错误或者警告消息相关的提示消息文本 |
22 | internal_query | text | 内部产生的查询文本 |
23 | internal_query_pos | int | 指向内部产生的查询文本中的光标 |
24 | event_context | text | 产生消息的上下文 |
25 | debug_query_string | text | 带有完整细节的用户提供的查询字符串,用于调试。这个字符串可能会由于内部使用而修改。 |
26 | error_cursor_pos | int | 指向查询字符串中的光标 |
27 | func_name | text | 产生这个消息的函数 |
28 | file_name | text | 产生消息的内部代码文件 |
29 | file_line | int | 产生消息的内部代码文件的行号 |
30 | stack_trace | text | 与这个消息相关的栈跟踪文本 |
日志说明
pg_log
- 这个日志一般是记录服务器与DB的状态,比如各种Error信息,定位慢查询SQL,数据库的启动关闭信息,发生checkpoint过于频繁等的告警信息,诸如此类。
- linux自带的路径一般在/home/log/postgres下面,该日志有.csv格式和.log。前一种一般会按大小和时间自动切割,这种日志可以被清理删除、压缩打包或者转移,不影响DB的正常运行。当有遇到DB无法启动或者更改参数没有生效时,第一个想到的就是查看这个日志。
- 四类错误级别,FATAL-严重告警,ERROR-错误,WARNING-警告,LOG-操作日志。文本文件查询检索不方便,这些文件是有固定格式,可以采用外部表的方式进行查询,同时可以利用相关的工具进行过滤。
- 记录各种Error信息,以及服务器与DB的状态信息,可由用户随意更新删除.
pg_xlog
-
这个日志是记录的Postgresql的WAL信息,是一些事务日志信息(transaction log),默认单个大小是16M,源码安装的时候可以更改其大小。
-
这些信息名字是类似‘00000001000000000000001A‘这样的文件,这些日志会在定时回滚恢复(PITR),流复制(Replication Stream)以及归档时能被用到。
-
这些日志记录着数据库发生的各种事务信息,不得随意删除或者移动这类日志文件,不然的数据库会有无法恢复的风险。
-
当你的归档或者流复制发生异常的时候,事务日志会不断地生成,有可能会造成磁盘空间被塞满,最终导致DB宕机或者无法启动。遇到这种情况可以先关闭归档或者流复制功能,备份pg_xlog日志到其他地方,但不要删除。然后删除较早时间的的pg_xlog,有一定空间后再试着启动Postgres。
pg_clog
- pg_clog事务日志文件,但与pg_xlog不同的是它记录的是事务的元数据(metadata),
- 这个日志告诉我们哪些事务完成了,哪些没有完成。
- 这个日志文件一般非常小,但是重要性也是相当高,不得随意删除或者对其更改信息。
启动和关闭日志
使用gpstart,gpstop 等相关命令的日志,默认位于~/gpAdminLogs目录下
命令方式:<script_name>_.log 日志记录的格式: ::::[INFO|WARN|FATAL]:
日志常用参数和配置方案
常用参数
下面是Greenplum与安全相关的审计(或者日志)服务器配置参数,它们可以在postgresql.conf配置文件中设置:
域名 | 值范围 | 默认 | 描述 |
---|---|---|---|
log_connections | Boolean | off | 会向服务器日志输出一行,详细说明每个成功的连接。 某些客户端程序(如psql)在确定是否需要密码时尝试连接两次,因此重复的“已接收连接”消息不一定存在问题。 |
log_disconnections | Boolean | off | 这在客户端会话终止时在服务器日志中输出一行,并包括会话的持续时间。 |
log_statement | NONE,DDL,MOD,ALL | ALL | 控制记录哪些SQL语句。 DDL记录所有数据定义命令,如CREATE,ALTER和DROP命令。 MOD记录所有DDL语句,以及INSERT,UPDATE,DELETE,TRUNCATE和COPY FROM。 如果包含的命令属于适当的类型,也会记录PREPARE和EXPLAIN ANALYZE语句。 |
log_hostname | Boolean | off | 默认情况下,连接日志消息仅显示连接主机的IP地址。 打开此选项会导致记录数据库主服务器的IP地址和主机名。 根据主机名解析设置可能会造成不可忽视的性能损失。 |
log_duration | Boolean | off | 记录满足log_statement的每个已完成语句的持续时间。 |
log_error_verbosity | TERSE,DEFAULT,VERBOSE | DEFAULT | 控制记录的每条消息在服务器日志中写入的详细信息量。 |
log_min_duration_statement | 毫秒数, 0, -1 | -1 | 如果语句的持续时间大于或等于指定的毫秒数,则将语句及其持续时间记录在单个日志行上。 将此值设置为0将打印所有语句及其持续时间。 -1禁用该功能。 例如,如果将其设置为250,则将记录运行250毫秒或更长时间的所有SQL语句。 启用此选项可用于跟踪应用程序中未优化的查询。 |
log_min_messages | DEBUG5,DEBUG4, DEBUG3,DEBUG2, DEBUG1,INFO, NOTICE,WARNING, LOG,ERROR, FATAL,PANIC | NOTICE | 控制将哪些消息级别写入服务器日志。 每个级别包括其后的所有级别。 级别越靠后,发送到日志的消息越少。 |
log_rotation_age | 任意有效的时间表达式(数字和单位) | 1d | 确定数据库将消息写入活动日志文件的时间。 经过这段时间后,文件将关闭并创建一个新的日志文件。 设置为零禁用基于时间的新日志文件创建。 |
log_statement_stats | Boolean | off | 对于每个查询,将查询解析器,优化器和执行器的总体性能统计信息写入服务器日志。 这是一种原始的分析工具。 |
log_truncate_on_rotation | Boolean | off | 截断(覆盖)而不是附加到任何现有的同名日志文件。 仅当由于基于时间的旋转而打开新文件时才会发生截断。 例如,将此设置与log_filename(例如gpseg#-%H.log)结合使用将导致生成二十四小时的日志文件,然后循环覆盖它们。 禁用时,将在所有情况下追加预先存在的文件。 |
配置方案
如下一共三个配置方案,可根据业务需求进行配置
0、通用配置
参数 | 说明 |
---|---|
logging_collector | 是否打印log |
log_line_prefix | 日志格式 |
log_directory | 日志保存目录 |
log_statement | 打印sql 类型 |
log_min_duration_statement | 记录超时sql,超时多少秒记录 |
1、每天生成一个日志文件
参数 | 说明 |
---|---|
log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log‘ | 文件名 |
log_truncate_on_rotation = off | 文件存在是否覆盖 |
log_rotation_age = 1d | 间隔多长时间更换新文件 |
log_rotation_size = 0 | 超过大小则换一个文件 |
2、每当日志写完一定大小,则换一个
参数 | 说明 |
---|---|
log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log‘ | 文件名 |
log_truncate_on_rotation = off | 文件存在是否覆盖 |
log_rotation_age = 0 | 间隔多长时间更换新文件 |
log_rotation_size = 10M | 超过大小则换一个文件 |
3、根据星期保留7天日志,循环替换
参数 | 说明 |
---|---|
log_filename = ‘postgresql-%a.log‘ | 星期 |
log_truncate_on_rotation = on | 开启覆盖 |
log_rotation_age = 1d | 间隔多长时间更换新文件 |
log_rotation_size = 0 | 超过大小则换一个文件 |
日志分析
-
文件查看和检索
-
利用外部表方式进行查询
-
通过logstash工具进行定制分析
-
通过在安装了gpperfmon组件的情况下,通过log_alert_history 进行查询
-
通过gplogfilter工具来查找匹配指定标准的日志数据
gplogfilter 查看日志
日志文件对于确定出错的原因可以提供更多的信息。 Master和每个Segment都有日志文件,位于数据目录下的 pg_log 中。 Master 的日志文件包含着最多的信息,应该首先检查Master日志文件。
可以使用 gplogfilter命令 检查GPDB日志文件。要检查 Segment 的日志文件,可以使用 gpssh 在 Segment 主机上运行 gplogfilter命令。
参数选项
####时间戳选项
-b datetime | --begin=datetime
#以格式YYYY-MM-DD [hh:mm[:ss]] 指定要搜索的日志项的开始日期时间,如果指定一个时间,日期和时间必须被封闭在单引号或者双引号中。
-e datetime | --end=datetime
#指定一个YYYY-MM-DD [hh:mm[:ss]] 格式的结束日期时间来停止搜索日志信息。
-d time | --duration=time
#以[hh][:mm[:ss]]格式指定要搜索的日志项所在的时间长度。如果指定这个选项但没有指定-b或-e选项,将使用当前时间作为基础。
####模式匹配选项
-c i[gnore] | r[espect] || --case=i[gnore] | r[espect]
#除非前面放上--case=ignore选项,字母表符号的匹配默认是大小写敏感的。
-C ‘string‘ | --columns=‘string‘
#从日志文件中选择特定的列。将想要的列指定为由逗号定界的列编号串,列编号从1开始, 从左到右依次是1、2、3等等。
-f ‘string‘ | --find=‘string‘
#查找包含指定字符串的日志项。
-F ‘string‘ | --nofind=‘string‘
#拒绝包含指定字符串的日志项。
-m regex | --match=regex
#查找匹配指定的Python正则表达式的日志项。
-M regex | --nomatch=regex
#拒绝匹配指定Python正则表达式的日志项。
-t | --trouble
#只查找在第一行有ERROR:、FATAL:或者 PANIC:的日志项。
#### 输出选项
-n integer | --tail=integer
#限制输出为找到的符合条件日志项中的最后integer项。
-s offset [limit] | --slice=offset [limit]
#从符合条件的日志项列表中,从offset项处开始返回limit个项,其中为零的offset指示结果集中的第一项,并且任何不超过零的offset表示从结果集的末尾开始数。
-o output_file | --out=output_file
#将输出写到指定的文件或者目录位置而不是STDOUT。
-z 0-9 | --zip=0-9
#使用gzip把输出文件压缩到指定的压缩级别,其中0是不压缩,9是最大压缩。如果用户提供一个以.gz结束的输出文件名,该输出文件默认将使用最大压缩级别压缩。
-a | --append
#如果输出文件已经存在,会追加到该文件而不是覆盖它。
#### 输入选项
-input_file
#要在其中搜索的输入日志文件的名称。如果没有提供输入文件gplogfilter将使用环境变量$MASTER_DATA_DIRECTORY来定位Greenplum数据库的Master日志文件。要从标准输入读取,可使用一个破折号(-)作为输入文件名。
-u | --unzip
#使用gunzip解压输入文件。如果输入文件名以.gz结束, 它默认将被解压。
--help
#显示在线帮助。
--version
#显示这个工具的版本。
查询例子
- 查看Master和Segment日志文件 WARNING、 ERROR、 FATAL 或 PANIC 级别的日志信息:
#输出最后3行日志
gplogfilter -n 3
#查看master节点错误日志
gplogfilter -t /data/greenplum/data/master/gpseg-1/pg_log/gpdb-2021-08-31* > /data/greenplum/setlog.log
#查看segment所有节点错误日志
gpssh -f /usr/local/greenplum-db/seg_host -e ‘source /usr/local/greenplum db/greenplum_path.sh; gplogfilter -t /data/greenplum/data*/*/gpseg*/pg_log/gpdb-2021-08-31* ‘ > /data/greenplum/setlog.log
- 查看时间段日志
gplogfilter -b ‘2021-08-31 14:33:00‘ -e ‘2021-08-31 14:33:50‘
- 显示Master日志文件中时间戳位于最后10分钟内的所有日志消息:
gplogfilter -d :10
- 显示Master日志文件中包含字符串|con6 cmd11|的日志消息:
gplogfilter -f ‘|con6 cmd11|‘
日志文件视图
gp_toolkit管理模式下的日志视图,日志文件以外部表的形式通过SQL语句查询
视图名以gp_log开头,且仅有管理用户才能访问
gp_log_command_timings
该视图使用外部表来读取主数据库上的日志文件,并报告在数据库会话中执行的SQL命令的执行时间。 使用此视图需要超级用户权限。
列 | 描述 |
---|---|
logsession | 会话标识符(以"con"为前缀)。 |
logcmdcount | 会话中的命令号(以"cmd"为前缀)。 |
logdatabase | 数据库的名称。 |
loguser | 数据库用户的名称。 |
logpid | 进程ID(前缀为"p")。 |
logtimemin | 此命令的第一条日志消息的时间。 |
logtimemax | 该命令的最后一条日志消息的时间。 |
logduration | 语句从开始到结束时间的持续时间。 |
gp_log_database
该视图使用外部表读取整个Greenplum系统的服务器日志文件(master,primary和mirror), 并列出与当前数据库关联的日志条目。 可以通过会话ID(logsession)和命令ID(logcmdcount)标识关联的日志条目。 使用此视图需要超级用户权限。
列 | 描述 |
---|---|
logtime | 日志消息的时间戳。 |
loguser | 数据库用户的名称。 |
logdatabase | 数据库的名称。 |
logpid | 关联的进程ID(前缀为"p")。 |
logthread | 关联的线程数(以"th"为前缀)。 |
loghost | segment或master主机名。 |
logport | segment或master端口号。 |
logsessiontime | 会话连接打开时间。 |
logtransaction | 全局事务ID。 |
logsession | 会话标识符(以"con"为前缀)。 |
logcmdcount | 会话中的命令号(以"cmd"为前缀)。 |
logsegment | segment内容标识符 (对于primary标识符,前缀为"seg",对于mirror,前缀为"mir"。master服务器的内容ID始终为-1)。 |
logslice | 切片ID(正在执行的查询计划的一部分)。 |
logdistxact | 分布式事务ID。 |
loglocalxact | 本地事务ID。 |
logsubxact | 子事务ID。 |
logseverity | LOG, ERROR, FATAL, PANIC, DEBUG1或DEBUG2。 |
logstate | 与日志消息关联的SQL状态代码。 |
logmessage | 日志或错误消息文本。 |
logdetail | 与错误消息关联的详细消息文本。 |
loghint | 与错误消息关联的提示消息文本。 |
logquery | 内部生成的查询文本。 |
logquerypos | 游标索引到内部生成的查询文本中。 |
logcontext | 生成此消息的上下文。 |
logdebug | 用于调试的带有详细信息的查询字符串。 |
logcursorpos | 查询字符串中的游标索引。 |
logfunction | 生成此消息的函数。 |
logfile | 生成此消息的日志文件。 |
logline | 日志文件中生成此消息的行。 |
logstack | 与该消息关联的堆栈跟踪的全文。 |
gp_log_master_concise
该视图使用外部表从master日志文件读取日志字段的子集。 使用此视图需要超级用户权限。
列 | 描述 |
---|---|
logtime | 日志消息的时间戳。 |
logdatabase | 数据库的名称。 |
logsession | 会话标识符(以"con"为前缀)。 |
logcmdcount | 会话中的命令号(以"cmd"为前缀)。 |
logmessage | 日志或错误消息文本。 |
gp_log_system
该视图使用一个外部表来读取整个Greenplum系统(master,segment和mirror)的服务器日志文件,并列出所有日志条目。 可以通过会话ID(logsession)和命令ID(logcmdcount)标识关联的日志条目。 使用此视图需要超级用户权限。
列 | 描述 |
---|---|
logtime | 日志消息的时间戳。 |
loguser | 数据库用户的名称。 |
logdatabase | 数据库的名称。 |
logpid | 关联的进程ID(前缀为"p")。 |
logthread | 关联的线程数(以"th"为前缀)。 |
loghost | segment或master主机名。 |
logport | segment或master端口号。 |
logsessiontime | 会话连接打开时间。 |
logtransaction | 全局事务ID。 |
logsession | 会话标识符(以"con"为前缀)。 |
logcmdcount | 会话中的命令号(以"cmd"为前缀)。 |
logsegment | segment内容标识符 (对于primary标识符,前缀为"seg",对于mirror,前缀为"mir"。master服务器的内容ID始终为-1)。 |
logslice | 切片ID(正在执行的查询计划的一部分)。 |
logdistxact | 分布式事务ID。 |
loglocalxact | 本地事务ID。 |
logsubxact | 子事务ID。 |
logseverity | LOG, ERROR, FATAL, PANIC, DEBUG1或DEBUG2。 |
logstate | 与日志消息关联的SQL状态代码。 |
logmessage | 日志或错误消息文本。 |
logdetail | 与错误消息关联的详细消息文本。 |
loghint | 与错误消息关联的提示消息文本。 |
logquery | 内部生成的查询文本。 |
logquerypos | 游标索引到内部生成的查询文本中。 |
logcontext | 生成此消息的上下文。 |
logdebug | 用于调试的带有详细信息的查询字符串。 |
logcursorpos | 查询字符串中的游标索引。 |
logfunction | 生成此消息的函数。 |
logfile | 生成此消息的日志文件。 |
logline | 日志文件中生成此消息的行。 |
logstack | 与该消息关联的堆栈跟踪的全文。 |
日志文件的定期清理
greenplum日志存放在pg_log下,master节点和每个segment节点都会有,格式为gpdb-YYYY-MM-DD_hhmmss.cs
清理90天之前的日志文件
find ${GPDATA_HOME}/master/gpseg-1/pg_log -type f -name "gpdb-*.csv" -mtime +90 -exec rm -f {} \;