log_alert_*
log_alert_*
log_alert_*表存储pg_log的错误和警告。
这里有三种log_alert表,所有的表都有相同的列:
- log_alert_now是一个外部表,其数据文件存在$MASTER_DATA_DIRECTORY/gpperfmon/data中。在从数据收集代理收集数据和自动提交到log_alert_history表之间的时段,当前的pg_log错误和警告存储在log_alert_now中。
- log_alert_tail是一个外部表,其数据文件存在$MASTER_DATA_DIRECTORY/gpperfmon/data中。这是一个过渡表,其中存放着已经从log_alert_now中清除但是还没有提交到log_alert_history的pg_log错误和警告。它通常只包含了几分钟的数据。
- log_alert_history是一个常规表,它存储数据库范围的历史错误和警告数据。它被预分区为每月的分区表。分区会根据需要进行两个月的增量添加。管理员必须要删除那些不再需要的月份的旧分区。
列名 | 类型 | 描述 |
---|---|---|
logtime | timestamp with time zone | 该条日志的时间戳 |
loguser | text | 查询的用户 |
logdatabase | text | 被访问的数据库 |
logpid | text | 进程ID |
logthread | text | 线程号 |
loghost | text | 主机名或者IP地址 |
logport | text | 端口号 |
logsessiontime | timestamp with time zone | 会话时间戳 |
logtransaction | integer | 事务ID |
logsession | text | 会话ID |
logcmdcount | text | 命令计数 |
logsegment | text | Segment编号 |
logslice | text | 切片编号 |
logdistxact | text | 分布式事务 |
loglocalxact | text | 本地事务 |
logsubxact | text | 子事务 |
logseverity | text | 日志严重性 |
logstate | text | 状态 |
logmessage | text | 日志消息 |
logdetail | text | 细节信息 |
loghint | text | 提示信息 |
logquery | text | 执行的查询 |
logquerypos | text | 查询位置 |
logcontext | text | 上下文信息 |
logdebug | text | 调试 |
logcursorpos | text | 游标位置 |
logfunction | text | 函数信息 |
logfile | text | 源代码文件 |
logline | text | 源代码行 |
logstack | text | 栈追踪 |
日志处理和轮转
Greenplum数据系统日志记录器把警告日志写到$MASTER_DATA_DIRECTORY/gpperfmon/logs目录中。
代理进程(gpmmon)执行下面的步骤来合并日志文件然后将它们加载到gpperfmon数据库:
- 收集日志目录(除了最新的日志,它已被syslogger打开并且正被写入)下的所有gpdb-alert-*文件到单个文件alert_log_stage中。
- 装载alert_log_stage文件到gpperfmon数据库中的log_alert_history表。
- 清空alert_log_stage文件。
- 移除所有的gp-alert-*文件,除了最新的那个。
syslogger每24小时或者当当前的日志文件大小超过1M时轮转一次警告日志。如果有单个错误消息包含一个大型SQL语句或者大型的栈追踪,被轮转的日志文件可能会超过1MB。此外,syslogger以块的方式处理错误消息,每个日志进程都会有一个单独的块。块的大小取决于操作系统;比如,在Red Hat Enterprise Linux上,块的大小为4096字节。如果许多Greenplum数据库会话同时产生错误消息,那么在它大小被检查前以及日志选择被触发前,日志文件会显著地增大。