平时写代码时,总是需要用到打印调试输出,之前每次都是直接使用 printf 函数直接打印的,但是越来越发现很不方便。比如有时我想屏蔽打印调试信息时,总不能回去一点点的把原来的打印代码删除了吧。有时我需要分级别打印时,直接使用 printf 函数打印也不好操作。
在网上我发现了一个打印调试的日志库 EasyLogger
,这个 log 库的功能非常强大,可以满足各种需求了。到时我写文章记录下使用心得。
但是,我其实又不用这么强大的功能,虽然 EasyLogger
移植使用起来也不难,但自己所需要的功能也不用那么多。于是就自己捣鼓一下 log 的调试输出代码。
log打印调试代码
我大概需要的功能就是:
- 可以打开、关闭调试输出信息
- 输出信息有过滤机制,比如只打印报错、警告信息,过滤掉一些打印调试信息。输出过滤机制可以使用分级打印,这种方法很常用的,比如 linux 内核的打印信息也是有分级打印的。
- 做的漂亮点,可以根据输出信息级别,打印信息显示的颜色不一样。
我自己参考了 RT-Thread 写了这部分代码。
其中核心代码就是这部分分级打印代码:
dbg_log_line
宏定义如下:
这个宏的第一行代码就是首先打印输出 log 信息的前缀以及设置打印信息的显示颜色,打印的前缀我们可以根据需要自己设置,一般都是设置打印出文件名、行数等等。接着就是打印我们真正的 log 信息,最后一行接着打印换行。
完整的代码如下:
#ifndef __LOG_H__
#define __LOG_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
/* 日志输出总开关 */
#define DBG_ENABLE
/* 颜色输出开关 */
#define DBG_COLOR
/* 日志打印级别 */
#define DBG_ERROR 0
#define DBG_WARNING 1
#define DBG_INFO 2
#define DBG_LOG 3
/* 设置日志打印级别,级别越高输出的日志信息越多 */
#define DBG_LEVEL DBG_LOG
#ifdef DBG_ENABLE
/*
* The color for terminal (foreground)
* BLACK 30
* RED 31
* GREEN 32
* YELLOW 33
* BLUE 34
* PURPLE 35
* CYAN 36
* WHITE 37
*/
#ifdef DBG_COLOR
#define _DBG_COLOR(n) printf("\033["#n"m")
#define _DBG_LOG_HDR(lvl_name, color_n) \
printf("\033["#color_n"m[" lvl_name "/" "<%s:%d>" "] "