当前位置: 首页 > 科技观察

如何使用printf编写自己的日志打印系统?

时间:2023-03-14 00:29:02 科技观察

日志打印注意事项编写程序后,我们可以在需要的地方添加打印信息。同时需要考虑:日志输出开销大,尤其是在嵌入式系统中,或者执行时序比较严格。高应用场景。因此:a)只在需要的地方添加,而不是滥用。b)必须有一个全局开关,在不需要或产品发布时关闭输出或降低日志输出的频率。日志输出需要有优先级控制,例如:当发生错误时,日志的优先级最高,一般输出;一些重要的提示,中等优先级,可以在软件的调试版本中打开;一些不重要的提示,可能只会在需要的时候才打开(例如跟踪错误)。不要直接使用printf(或printk)。日志输出的目标多种多样,比如通过printf输出到屏幕,通过串口输出到串口调试助手,通过文件操作写入文件等等。需要通过重定义将所有的日志输出指令定义到合适的输出路径。当需要修改输出路径时,只需修改重新定义的部分即可。否则需要修改整个代码,很麻烦。最好为每个软件模块提供单独的日志输出开关,以增加调试的灵活性。在很多情况下,日志输出语句可以部分替代代码注释的功能。日志打印的实现结合以上注意事项,我们可以按照以下步骤实现一个小型的日志输出系统。新建一个debug.h(如果PC上只使用printf,只需要一个头文件即可,如果需要文件或者串口操作,可以在此基础上添加debug.c,此处不再赘述)暂时)定义一个宏开关,该开关用来控制日志的输出。/**调试控制,可以开启(删除'x'后缀)*启用日志输出和断言机制*/#defineCONFIG_ENABLE_DEBUG定义了ERR、INFO、DEBUG三种日志级别。/*定义三个日志级别:ERR、INFO、DEBUG。/**debug级别,*如果是DEBUG_LEVEL_DISABLE,则不允许输出日志,*如果是DEBUG_LEVEL_ERR,则只允许输出ERR,*如果是DEBUG_LEVEL_INFO,则允许输出ERR和INFO,*如果是DEBUG_LEVEL_DEBUG则允许输出,all,如果使用系统的printf,则需要包含stdio.h并将printf重新定义为PRINT。(无论是Windows还是Linux都是如此,如果是嵌入式平台,可以自定义PRINT接口)/*可以改成其他的,比如文件操作*/#include#definePRINTprintf定义定义日志记录输出级别的宏。/**设置调试级别的宏,你应该调用它*在你需要使用调试系统的文件中调用一次*/#defineDEBUG_SET_LEVEL(x)staticintdebug=x需要在每个需要日志输出的C文件中调用,如下:/**定义该文件的调试级别,*详细信息请参见'debug.h'*/DEBUG_SET_LEVEL(DEBUG_LEVEL_ERR);定义ASSERT、ERR、INFO、DEBUG等宏。#defineASSERT()\do{\PRINT("ASSERT:%s%s%d",\__FILE__,__FUNCTION__,__LINE__);\而(1);\}while(0)#defineERR(...)\do{\if(debug>=DEBUG_LEVEL_ERR){\PRINT(__VA_ARGS__);\}\}while(0)...在需要日志输出的C文件中包含debug.h,定义需要的日志级别。您可以在需要时输出日志信息。debug_test.c--------------------------------------------------#include"debug.h"/**定义此文件的调试级别,*请参阅'debug.h'了解详细信息*/DEBUG_SET_LEVEL(DEBUG_LEVEL_ERR);intmain(void){ERR("这是一条错误信息\n");INFO("这是一条信息消息\n");DEBUG("这是一条调试信息\n");ASSERT();返回0;}Step8.,修改允许输出的日志级别。