数据库日志系统在现代数据库管理系统(DBMS)中扮演着至关重要的角色。今天主要为大家分享 KWDB 日志系统,帮助大家了解其规范以及可以帮助你解决什么问题。Go!
KWDB 根据数据类型不同,生成的日志和存储位置也有所不同。下表列出了目前 KWDB 在数据库运维期间可能生成的所有日志:
日志 | 描述 | 存储位置 |
---|---|---|
时序引擎日志 | 记录时序引擎运行状态。日志名以 TsEngine 开头 | KWDB 用户数据目录下的 logs 子目录,默认路径为/var/lib/kaiwudb/logs。 通过--log-dir参数指定日志的位置 |
关系引擎日志 | 记录关系引擎运行状态,日志名以 kwbase-rocksdb 开头 | |
通用日志 | 记录非存储引擎的运行状态,日志名以 kwbase.log 开头 | |
审计日志 | 数据库活动和操作的详细记录 | 默认路径为 /var/lib/kaiwudb/logs。 通过--sql-audit-dir 参数单独指定审计日志的位置 |
错误日志 | 数据库异常时的 call stack 记录 | 数据库启动目录 |
KWDB 日志由启动参数进行控制,如通过--log-dir 参数来控制日志输出目录,通过 --log-file-verbosity 控制日志级别。日志相关的启动参数如下:
flag | 描述 |
---|---|
--log-dir | 启动日志功能并在指定的目录下记录日志。--log-dir配置为空字符串(--log-dir="")时,则关闭日志功能。 |
--log-dir-max-size | 所有日志文件大小达到一定阈值以后,KWDB将删除最老的日志。 默认值:100MiB |
--log-file-max-size | 单个日志文件大小达到一定阈值以后,KWDB将开启新的日志文件并输出日志到新文件当中。 默认值:10MiB |
--log-file-verbosity | 只有指定严重级别及以上的日志才输出到日志文件当中。例如: --log-file-verbosity=WARNING 默认值:INFO |
--logtostderr | 将指定严重级别及以上的日志输出到stderr,例如--logtostderr=ERROR 若使用该Flag时不指定配置值,则KWDB将所有严重级别的日志输出到stderr。 若配置为--logtostderr=NONE,则禁止日志输出到stderr。 |
--no-color | 是否对stderr着色,值为true或false。 值为false时,输出到stderr将基于自身严重级别进行着色。 默认值:false |
--sql-audit-dir | 安全审计日志的位置,默认情况下,SQL审核日志与KWDB生成的其他日志写入同一目录。有关更多信息,请参见集群的审计日志章节。 |
--vmodule | 用于启用文件过滤日志记录,支持通过逗号分隔的pattern=N列表指定,可能会严重影响性能。 |
时序日志 TsEngine.log 记录时序引擎的日志信息,日志以 [日志级别][时间戳][线程号][代码文件和行号][定制化日志信息] 为格式。其中
日志级别:下列字符之一, "D", "I", "W", "E", "F" 分别表示 debug,info,warning,error,fatal
时间戳:格式为 [yymmdd HH:MM:SS.usec]
线程号:对应 TID
代码文件和行号:filename:loc
定制化日志信息:时序引擎运行记录信息,如时序副本迁移、WAL recover
日志示例
I2407 2 11:28:05.862568 246 MMapHashIndex.cpp:163 Hash Index 79.tag.ht rehash, new_size: 256I2407 2 11:34:02.260845 265 db.cpp:181 table 78, update rangeGroup 4 to follower
时序日志 kwbase-rocksdb.log 记录时序引擎 rocksdb 的日志信息。日志以 [日志级别][时间戳][线程号][代码文件和行号][定制化日志信息] 为格式。其中:
日志级别:下列字符之一, "D", "I", "W", "E", "F" 分别表示 debug,info,warning,error,fatal
时间戳:格式为 [yymmdd HH:MM:SS.usec]
线程号:对应 TID
代码文件和行号:filename:loc
定制化日志信息:时序引擎运行记录信息,如 rocksdb 压缩记录
日志示例
I240702 03:28:09.254802 8370 storage/rocksdb.go:103 (Original Log Time 2024/07/02-11:28:09.254709) EVENT_LOG_v1 {"time_micros": 1719890889254695, "job": 262, "event": "compaction_finished", "compaction_time_micros": 34185, "compaction_time_cpu_micros": 33466, "output_level": 6, "num_output_files": 1, "total_output_size": 593244, "num_input_records": 10455, "num_output_records": 9753, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [1, 0, 0, 0, 0, 0, 3]}I240702 03:28:09.254931 8370 storage/rocksdb.go:103 EVENT_LOG_v1 {"time_micros": 1719890889254913, "job": 262, "event": "table_file_deletion", "file_number": 497}
通用日志 kwbase.log 记录非存储引擎的日志信息。日志以 [日志级别][时间戳][线程号][代码文件和行号][定制化日志信息] 为格式。其中:
日志级别:下列字符之一, "D", "I", "W", "E", "F" 分别表示 debug,info,warning,error,fatal
时间戳:格式为 [yymmdd HH:MM:SS.usec]
线程号:对应 TID
代码文件和行号:filename:loc
定制化日志信息:非存储引擎运行记录信息,如节点心跳、通信状态
日志示例
W240706 00:57:35.240359 1511957 vendor/google.golang.org/grpc/clientconn.go:1206 grpc: addrConn.createTransport failed to connect to {server_svt_node_4:26257 0 <nil>}. Err :connection error: desc = "transport: Error while dialing cannot reuse client connection". Reconnecting...E240706 00:57:35.240491 1511904 rpc/context.go:1003 [n1] removing connection to server_svt_node_4:26257 due to error: cannot reuse client connection
审计日志
审计功能由 admin 用户通过 SQL 语句开启:
set cluster setting audit.enabled = true;
开启后,系统会默认将审计结果保存在审计日志文件。审计日志文件包含以下信息:
字段 | 说明 | 示例 |
---|---|---|
日志级别和日期 | 审计日志的级别和记录日期,其中日志级别为I。 | I240415 |
时间 | UTC格式的时间戳 | 06:49:34.207014 |
goroutine id | 记录该审计的goroutine id | 538 |
审计源码文件路径 | 打印日志的源码文件及代码行 | security/audit/actions/record_to_log.go:45 |
节点 | 记录审计日志的节点ID | [n1] |
日志输入计数 | 历史累计审计消息数 | 3 |
事件发生时间 | 审计事件的发生时间 | "EventTime":"2024-04-15T06:49:34.206948441Z" |
事件执行时间 | 审计事件的执行时间间隔 | "Elapsed":2242701 |
用户信息 | 用户和角色信息,包括以下字段:
| "User":{"UserID":0,"Username":"root","Roles":[{"ID":0,"Name":"admin"}]} |
事件类型 | 在对象上的操作类型,例如创建、删除等 | "Event":"CREATE" |
操作对象 | 操作对象的信息,包括以下字段:
| "Target":{"Typ":"DATABASE","Targets":{"78":{"ID":78,"Name":"db1","Cascades":null}}} |
审计级别 | 系统级:0;语句级:1;对象级:2 | "Level":1 |
客户端信息 | 客户端信息,包括以下字段:
| Client":{"AppName":"$ kwbase sql","Address":"127.0.0.1:55564"} |
事件执行结果 | 事件执行结果,包括以下字段:
| "Result":{"Status":"OK","ErrMsg":"","RowsAffected":0} |
执行语句 | 执行语句信息,包括以下字段:
| "Command":{"Cmd":"CREATE DATABASE db1","Params":"{}"} |
审计事件记录节点 | 审计事件记录节点的信息,包括以下字段:
| "Reporter":{"ClusterID":"ae93118d-28bc-492f-bd4f-852cafab0ad9","NodeID":1,"HostIP":"localhost","HostPort":"26257","HostMac":"","LastUp":0}} |
日志示例
I240415 06:49:34.207014 538 security/audit/actions/record_to_log.go:45 [n1] 3 {"EventTime":"2024-04-15T06:49:34.206948441Z","Elapsed":2242701,"User":{"UserID":0,"Username":"root","Roles":[{"ID":0,"Name":"admin"}]},"Event":"CREATE","Target":{"Typ":"DATABASE","Targets":{"78":{"ID":78,"Name":"db1","Cascades":null}}},"Level":1,"Client":{"AppName":"$ kwbase sql","Address":"127.0.0.1:55564"},"Result":{"Status":"OK","ErrMsg":"","RowsAffected":0},"Command":{"Cmd":"CREATE DATABASE db1","Params":"{}"},"Reporter":{"ClusterID":"ae93118d-28bc-492f-bd4f-852cafab0ad9","NodeID":1,"HostIP":"localhost","HostPort":"26257","HostMac":"","LastUp":0}}
如需关闭审计日志,可通过以下 SQL 语句将 audit.log.enabled 设为 false:
set cluster setting audit.log.enabled=false;
错误日志
错误 errlog.log 会记录数据库严重异常时,数据库进程的当前 call stack 记录。
日志示例
Exception time(UTC):2024-11-02 13:33:22signal:Segmentation fault(11)pid=109818 tid=110896 si_code=1 si_addr=0x48backtrace: size:14#0 /usr/local/kaiwudb/bin/../lib/libcommon.so(kwdbts::PrintBacktrace(std::ostream&)+0x3d) [0x7fa9805b2f9d]#1 /usr/local/kaiwudb/bin/../lib/libcommon.so(kwdbts::ExceptionHandler(int, siginfo_t*, void*)+0x281) [0x7fa9805b36a1]#2 /lib/x86_64-linux-gnu/libc.so.6(+0x42520) [0x7fa97fd51520]#3 /usr/local/kaiwudb/bin/../lib/libkwdbts2.so(+0x2546d3) [0x7fa98082c6d3]#4 /usr/local/kaiwudb/bin/../lib/libkwdbts2.so(kwdbts::SynchronizerOperator::~SynchronizerOperator()+0x2a7) [0x7fa98082e0b7]#5 /usr/local/kaiwudb/bin/../lib/libkwdbts2.so(kwdbts::SynchronizerOperator::~SynchronizerOperator()+0xd) [0x7fa98082e1dd]#6 /usr/local/kaiwudb/bin/../lib/libkwdbts2.so(kwdbts::Processors::Reset()+0x37) [0x7fa980816677]#7 /usr/local/kaiwudb/bin/../lib/libkwdbts2.so(kwdbts::DmlExec::DestroyTsScan(kwdbts::DmlExec::TsScan*)+0x4e) [0x7fa9807963ee]#8 /usr/local/kaiwudb/bin/../lib/libkwdbts2.so(kwdbts::DmlExec::ClearTsScans(kwdbts::_kwdbContext_t*)+0x51) [0x7fa980796771]#9 /usr/local/kaiwudb/bin/../lib/libkwdbts2.so(kwdbts::DmlExec::Next(kwdbts::_kwdbContext_t*, int, bool, _QueryInfo*)+0xeb) [0x7fa980796e7b]#10 /usr/local/kaiwudb/bin/../lib/libkwdbts2.so(kwdbts::DmlExec::ExecQuery(kwdbts::_kwdbContext_t*, _QueryInfo*, _QueryInfo*)+0x174) [0x7fa980797004]#11 /usr/local/kaiwudb/bin/../lib/libkwdbts2.so(TSExecQuery+0x261) [0x7fa980728571]#12 /usr/local/kaiwudb/bin/kwbase(_cgo_b2bb81300987_Cfunc_TSExecQuery+0x31) [0x36abbe1]#13 /usr/local/kaiwudb/bin/kwbase() [0x6a1b70]
以上就是数据库运维系列的第一篇,更多精彩后续欢迎关注我们!