最近调试C代码,发现要写很多打印的内容不是很方便,于是简单写一下C语言的日志来方便自己调试:
1. 简单打印带标识的日志信息
#include "stdio.h"
#define PRINT(...) \
do \
{ \
printf(__VA_ARGS__); \
} while (0)
#define LOG_INFO(...) PRINT("[info] " __VA_ARGS__)
#define LOG_DEBUG(...) PRINT("[debug] " __VA_ARGS__)
#define LOG_WARNING(...) PRINT("[warning] " __VA_ARGS__)
#define LOG_ERROR(...) PRINT("[error] " __VA_ARGS__)
#define LOG_CRITICAL(...) PRINT("[critical] " __VA_ARGS__)
在网上查资料还知道可以根据日志的等级来打印相关的日志信息
我们可以写成这样:
2. 添加日志级别判断打印日志信息(无标识)
#include "stdio.h"
#define LOG_LEVEL DEBUG_LEVEL
#define DEBUG_LEVEL 0
#define INFO_LEVEL 1
#define WARNING_LEVEL 2
#define ERROR_LEVEL 3
#define CRITICAL_LEVEL 4
#define LOG(level, ...) do { \
if (level >= LOG_LEVEL) { \
printf(__VA_ARGS__); \
} \
} while (0)
#define LOG_DEBUG(...) LOG(DEBUG_LEVEL, __VA_ARGS__)
#define LOG_INFO(...) LOG(INFO_LEVEL, __VA_ARGS__)
#define LOG_WARNING(...) LOG(WARNING_LEVEL, __VA_ARGS__)
#define LOG_ERROR(...) LOG(ERROR_LEVEL, __VA_ARGS__)
#define LOG_CRITICAL(...) LOG(CRITICAL_LEVEL, __VA_ARGS__)
当打印级别大于等于某个级别才会打印相应的信息,但是我们不知道打印的是哪个信息,能不能像前面一样有一个标识呢?多打一个printf就好了。
3. 添加日志级别判断打印日志信息(带标识)
#include "stdio.h"
#define DEBUG_LEVEL 0
#define INFO_LEVEL 1
#define WARNING_LEVEL 2
#define ERROR_LEVEL 3
#define CRITICAL_LEVEL 4
#define DEBUG DEBUG_LEVEL
#define INFO INFO_LEVEL
#define WARNING WARNING_LEVEL
#define ERROR ERROR_LEVEL
#define CRITICAL CRITICAL_LEVEL
#define LOG_DEBUG(...) LOG(DEBUG , __VA_ARGS__)
#define LOG_INFO(...) LOG(INFO , __VA_ARGS__)
#define LOG_WARNING(...) LOG(WARNING , __VA_ARGS__)
#define LOG_ERROR(...) LOG(ERROR , __VA_ARGS__)
#define LOG_CRITICAL(...) LOG(CRITICAL , __VA_ARGS__)
#define LOG(level, ...) do { \
if (level >= LOG_LEVEL) { \
printf("[%s] ", #level); \
printf(__VA_ARGS__); \
} \
} while (0)
使用也挺方便:
#include "stdio.h"
int main()
{
LOG_INFO("this is info %d\n", 1);
LOG_DEBUG("this is debug %d\n", 2);
LOG_WARNING("this is warning %d\n", 3);
LOG_ERROR("this is error %d\n", 4);
LOG_CRITICAL("this is critical %d\n", 5);
return 0;
}