几行代码给MySQL增加日志实时输出函数

Posted 老叶茶馆_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几行代码给MySQL增加日志实时输出函数相关的知识,希望对你有一定的参考价值。

* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。

1.简介

mysql源码感兴趣的小伙伴,在学习源码的过程中都会有想一探某处代码在运行时当前的数据是个怎样的内容或者执行流程,想要知道具体情况无非可以通过两种方式,一种是gdb下断点查看,另外一种就是直接在想要查看的代码位置加入日志输出方式。输出日志的方式又分多种,比如有的可以用自带的设置调试模式输出调试日志,有的则可以采用自己添加输出错误日志形式。我们此处要说的就是使用后者,因本人比较习惯使用直接按自定义的格式自由组合输出且无参数限制方式,并希望实时看到输出信息,而目前现有的MySQL几个日志输出函数并不完全满足需求,因此在MySQL原有的一些函数基础上封装出一个可以满足需要的函数my_message_print

2.具体函数实现

啰嗦一堆干货如下,本实现适用于MySQL8.0及以上代码

1)在源码目录include/my_sys.h 文件最后#endif 之上添加如下声明

#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__)

该声明主要功能定义输出日志的头包含打印日志所在文件、所在函数、所在行数。同时为了便于查看加入终端实时输出时日志的颜色区分,以及从行首覆盖输出的设置。

2)在源码目录mysys/my_error.cc文件内最后追加以下函数

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);

3.编译调用

编译成功终于就可以自由输出了!

调用:

在需要输出的代码内添加类似: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增加日志实时输出函数的主要内容,如果未能解决你的问题,请参考以下文章

flume搜集日志:如何解决实时不断追加的日志文件及不断增加的文件个数问题

mysql怎么开启慢查询日志开启

mysql-开启慢查询&所有操作记录日志

有一个实时监控的项目,现在我想要在C#代码中监测mysql数据库中一张表的更新变化的情况,

如何从定时日志表中获取实体之间的时间跨度?

python pytest测试框架介绍五---日志实时输出