* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
对MySQL源码感兴趣的小伙伴,在学习源码的过程中都会有想一探某处代码在运行时当前的数据是个怎样的内容或者执行流程,想要知道具体情况无非可以通过两种方式,一种是gdb下断点查看,另外一种就是直接在想要查看的代码位置加入日志输出方式。输出日志的方式又分多种,比如有的可以用自带的设置调试模式输出调试日志,有的则可以采用自己添加输出错误日志形式。我们此处要说的就是使用后者,因本人比较习惯使用直接按自定义的格式自由组合输出且无参数限制方式,并希望实时看到输出信息,而目前现有的MySQL几个日志输出函数并不完全满足需求,因此在MySQL原有的一些函数基础上封装出一个可以满足需要的函数my_message_print
。
啰嗦一堆干货如下,本实现适用于MySQL8.0及以上代码
#define outfilename(x) strrchr(x,'/')?strrchr(x,'/')+1:x
extern void debug_message_print(const char *format, ...)
MY_ATTRIBUTE((format(printf, 1,2)));
#define my_message_print(format, ...) debug_message_print("\r\n\033[44;37m---->%s|%s|%d|\033[0m" format, outfilename(__FILE__), __FUNCTION__, __LINE__, ##__VA_ARGS__)
该声明主要功能定义输出日志的头包含打印日志所在文件、所在函数、所在行数。同时为了便于查看加入终端实时输出时日志的颜色区分,以及从行首覆盖输出的设置。
void debug_message_print(const char *format, ...) {
va_list args;
char ebuff[ERRMSGSIZE];
DBUG_TRACE;
enum loglevel level = WARNING_LEVEL;
va_start(args, format);
(void)vsnprintf(ebuff, sizeof(ebuff), format, args);
va_end(args);
my_message_local(level,EE_DEBUG_INFO,ebuff);
}
编译成功终于就可以自由输出了!
在需要输出的代码内添加类似:my_message_print("%d,%s%xxxxx......",看看参数a,看看参数b,xxxxx,....); 来输出感兴趣的参数内容。
在sql_yacc.yy
之中也可以使用呦。
例如在sql_yacc.yy
中感兴趣代码位置添加日志输出:
my_message_print(">>>>>>>>>>>>>>>>>>>我是查询");
my_message_print(">>>>>>>>>>>>>>>>>>>查询表[%s]",$1.str);
Linux或Mac环境小伙伴可以通过终端执行命令:tail -f mysql.log 来实时监控查看到日志的输出。
编译并执行查询语句,tail -f mysql.log实时查看mysql.log文件
即可看到输出如:
---->sql_yacc.yy|MYSQLparse|16799|>>>>>>>>>>>>>>>>>>>查询表[test1].
---->sql_yacc.yy|MYSQLparse|10570|>>>>>>>>>>>>>>>>>>>我是查询.
Enjoy GreatSQL :)
《深入浅出MGR》视频课程
戳此小程序即可直达B站
https://www.bilibili.com/medialist/play/1363850082?business=space_collection&business_id=343928&desc=0
文章推荐:
MySQL 8.0.31并行构建索引特性管窥
分布式系统中的时钟与一致性解读
MySQL进程内存一直在涨,怎么办?
events scheduler导致MGR节点退出详解及修复
无损半同步复制下,主从切换后数据一致吗?
MySQL内存管理机制浅析
想看更多技术好文,点个“在看”吧!