日志系统原理
lightdb 通过管道机制实现其他进程和日志进程 syslogger 之间的通信,如图:
- postmaster 进程将 stderr 和 stdout 重定向到管道 syslogPipe 中;
- 通过 elog/ereport 写日志时,实际上是将日志信息写入到 stderr;
- syslogger 进程则循环从管道 syslogPipe 中读出,最终写到指定的日志文件中去;
日志协议格式定义如下:
typedef struct
{
char nuls[2]; /* always \0\0 */
uint16 len; /* size of this chunk (counts data only) */
int32 pid; /* writer's pid */
char is_last; /* last chunk of message? 't' or 'f' ('T' or 'F' for CSV case) */
char data[FLEXIBLE_ARRAY_MEMBER]; /* data payload starts here */
} PipeProtoHeader;
elog.h/elog.c 则提供了一套写日志的接口:
#define ereport(elevel, ...) ereport_domain(elevel, TEXTDOMAIN, __VA_ARGS__)
#define elog(elevel, ...) ereport(elevel, errmsg_internal(__VA_ARGS__)) /* 旧风格接口 */
而 ereport_domain 函数最终是通过 write_pipe_chunks 函数实现向管道中写入格式化的日志信息;
支持慢日志
LightDB 模块 auto_explain 支持将 JSON 格式的慢日志信息写入到单独的慢日志文件中,通过配置 auto_explain 的参数,满足慢日志条件的执行信息会自动写入到慢日志文件中;
慢日志和正常的日志文件以及 CSV 日志一样,支持自动清理,通过配置 lightdb_log_retention_age 来指定清理的范围;
------------------------------------------------------
更多内容请登录 LightDB官网 进行查看。