printf函数进阶---个性化彩色打印日志调试

1、痛点吐槽

        试想一下,随着项目开发持续向前推进,例如下图所示,输出的信息量非常的多,没有做任何的区分标识,是不是显得非常的杂乱无章,想要在短时间内,一眼看到核心数据或者需要的数据信息,会比较的困难,这非常的不利于开发和后期维护。

        因此需要着手解决上面指出的问题,在较多的日志系统或集成化的编译器平台中,命令终端输出的信息都带有各种颜色标识,开发者可以非常清楚的区分输出的信息,哪些是核心信息,哪些是普通的打印信息,非常的清晰明了,极大的推动了项目开发的进度。

2、printf打印颜色文本

        在经常使用的标准的C语言或C++中,printf 函数本身并不支持直接打印彩色文本。但是在使用printf函数时,可以通过向终端发送特定的转义序列(ANSI转义序列),以达到改变文本的颜色和样式的作用

printf("\033[00;44;35mPASSED\033[01;0m\n"); 
如上所示是通过printf函数,使用ANSI转义序列实现输出颜色的一条函数指令
格式说明:
\033[       表示的是ESC字符(ASCII码27),后面开始接的是颜色代码
00          表示的是低亮显示
;          分隔符作用
44          表示背景色为蓝色
;          分隔符作用
35m         表示字符颜色为紫色
PASSED      表示输出的字符串

字体背景颜色范围(40~49):

40

黑色

41

红色

42

绿色

43

黄色

44

蓝色

45

紫色

46

深绿色

47

白色

字体颜色范围(30~39):

30

黑色

31

红色

32

绿色

33

黄色

34

蓝色

35

紫色

36

深绿色

37

白色

3、参考程序代码

        在下面的printf颜色调试代码中,实现了对不同的日志信息打印呈现不同的颜色,在开发过程中,根据实际的数据优先级情况,可以直接传入不同的参数进行调用,具体的实现效果,见文章末尾。

①、debug.c

#include "debug.h"

void DBUG_SHOW(int type, const char* format, ...)
{
#ifdef OPEN_DEBUG
    va_list args;
    char msg[256] = {0};
    int written;  

    va_start(args, format);
    written = vsnprintf(msg, sizeof(msg), format, args);
    va_end(args);
    if (written < 0 || written >= sizeof(msg)) {  
        printf("msg buffer size not enough!\n");
        return;
    }
    switch (type)
    {
    case DBUG_INFO:
        printf("%s", msg);
        break;
    case DBUG_WARN:
        printf("\033[%d;%dm%s\033[01;0m", LOWLIGHT, YELLO_FONT, msg);
        break;
    case DBUG_ERROR:
        printf("\033[%d;%dm%s\033[01;0m", HIGHLIGHT, RED_FONT, msg);
        break;
    case DBUG_VITAL:
        printf("\033[%d;%dm%s\033[01;0m", LOWLIGHT, GREEN_FONT, msg);
        break;
    }
#endif
}

②、debug.h

#ifndef __DEBUG_H
#define __DEBUG_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

#define OPEN_DEBUG

#define LOWLIGHT        00
#define HIGHLIGHT       01

//背景色范围40~49
#define BLACK_BG        40
#define RED_BG          41
#define GREEN_BG        42
#define YELLO_BG        43
#define BLUE_BG         44
#define PURPLE_BG       45
#define DARK_GREEN_BG   46
#define WHITE_BG        47

//字符色范围30~39 
#define BLACK_FONT      30
#define RED_FONT        31
#define GREEN_FONT      32
#define YELLO_FONT      33
#define BLUE_FONT       34
#define PURPLE_FONT     35
#define DARK_GREEN_FONT 36
#define WHITE_FONT      37

enum{
    DBUG_INFO,
    DBUG_WARN,
    DBUG_ERROR,
    DBUG_VITAL
};

void DBUG_SHOW(int type, const char* format, ...);

#endif

4、程序效果展示

①、测试代码

#include <stdio.h>
#include "debug.h"

int main(int argc, char**argv)
{
    printf("\033[01;32mPASSED\033[0;0m\n"); 
    printf("\033[01;31mFAILED\033[0;0m\n");

    printf("\033[00;44;35mPASSED\033[01;0m\n"); 
    printf("\033[00;43;31mFAILED\033[01;0m\n"); 
    
    DBUG_SHOW(DBUG_INFO, "今天是星期六\n");
    DBUG_SHOW(DBUG_WARN, "今天可能会下雨哦\n", 100, 78.234);
    DBUG_SHOW(DBUG_ERROR, "现在在挂台风啊\n");
    DBUG_SHOW(DBUG_VITAL, "快跑快跑...\n");
    
    return 0;
}

②、运行结果

        通过上述的代码,可以实现对终端打印输出的信息非常清晰明了的区分出来,将其运用到实际的项目代码中,可以更加直观的了解程序的运行状态,辅助开发者进行程序调试和优化等

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值