这段代码使用C语言实现一个简单的日志系统,包括日志级别控制、日志信息格式化输出等。
虽然存储功能没有实现,但已经提供了一个基本的框架,可以根据需要进行扩展,比如添加日志文件的写入功能等。下面是对代码的详细解读:
log.h
#ifndef _EM_LOG_H_
#define _EM_LOG_H_ // 防止头文件被重复包含
#include <stdio.h>
#include <stdarg.h>
#define OPEN_LOG 1
#define LOG_LEVEL LOG_WARNING // 日志级别控制
#define LOG_SAVE 1
typedef enum
{
LOG_DEBUG = 0,
LOG_INFO,
LOG_WARNING,
LOG_ERROR,
} E_LOGLEVEL;
void EM_LOG(const int, const char*, const int, const char*, ...); // 日志功能宏
#define EMLog(level, fmt...) EM_LOG(level, __FUNCTION__, __LINE__, fmt)
#endif
-
防止重复包含:通过预处理指令防止头文件被重复包含。这是一种常见的做法,可以避免编译时因头文件重复包含而导致的错误。
-
包含标准库头文件:
#include <stdarg.h>
引入可变参数处理的功能。 -
日志级别控制:通过预处理指令定义了日志级别控制宏,其中
OPEN_LOG
用于控制日志功能是否开启,LOG_LEVEL
用于设置日志输出的级别。 -
日志级别枚举:定义了一个枚举类型
E_LOGLEVEL
,包含四个级别。 -
日志打印函数:声明
EM_LOG
函数,它接受日志级别、函数名、行号、格式化字符串和可变参数。 -
日志打印宏定义:定义了
EMLog
宏,它接受日志级别和格式化字符串作为参数,并调用EM_LOG
函数进行日志打印。宏的使用使得在代码中插入日志更加方便。
log.c
源文件 log.c 实现了日志系统的核心功能。
#include "log.h"
// 日志级别字符串获取
char * EM_LOGLevelGet(const int level)
{
if(level == LOG_DEBUG){
return "DEBUG";
}else if(level == LOG_INFO){
return "INFO";
}else if(level == LOG_WARNING){
return "WARNING";
}else if(level == LOG_ERROR){
return "ERROR";
}
return "UNKNOW";
}
// 可变参数
void EM_LOG(const int level, const char* fun, const int line, const char *fmt, ...)
{
printf("Logging level: %d, LOG_LEVEL: %d\n", level, LOG_LEVEL);
#ifdef OPEN_LOG
va_list arg;
va_start(arg, fmt); // 开始
char buf[vsnprintf(NULL, 0, fmt, arg) + 1]; // 返回可变参的长度, + 1 结束符\0
vsnprintf(buf, sizeof(buf), fmt, arg); // 将可变参内容打印到数组
va_end(arg); // 销毁
if(level >= LOG_LEVEL)
printf("[%s] [%s %d]%s\n", EM_LOGLevelGet(level), fun, line, buf);
// Todo 存储操作 ....
#endif
}
-
日志级别字符串获取函数:
EM_LOGLevelGet
函数根据日志级别返回对应的字符串。这个函数在打印日志时使用,以便将日志级别以文本形式输出。 -
日志打印函数:
EM_LOG
函数实现了日志的核心功能。它首先检查OPEN_LOG
宏是否定义,如果定义了则继续处理日志。函数使用va_list
处理可变参数,将格式化后的日志信息打印到标准输出。如果日志级别满足条件,则打印日志信息,包括日志级别、函数名、行号和日志内容。
main.c
#include <stdio.h>
#include "log.h"
int main()
{
EMLog(LOG_DEBUG, "app start");
EMLog(LOG_INFO, "A = %d", 10);
EMLog(LOG_WARNING, "app LOG_WARNING");
EMLog(LOG_ERROR, "app LOG_ERROR");
// EM_LOG(LOG_INFO, "A = %d", 10);
// EM_LOG(LOG_WARNING, "app LOG_WARNING");
// EM_LOG(LOG_ERROR, "app LOG_ERROR");
return 0;
}
好了就看到这里了 下次见哈哈哈哈哈哈哈
真想给你删评🙈
为什么 这都是我看过的痕迹 不准删哈哈哈
这不是你的问题,是我的问题,某到此一游😎