log日志框架

笔记 · 08-24 · 67 人浏览
log日志框架

  这段代码使用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;
}
C
  1. L 16 天前

    好了就看到这里了 下次见哈哈哈哈哈哈哈

    1. Justin_Wu (作者)  15 天前
      @L

      真想给你删评🙈

      1. L 15 天前
        @Justin_Wu

        为什么 这都是我看过的痕迹 不准删哈哈哈

        1. Justin_Wu (作者)  15 天前
          @L

          这不是你的问题,是我的问题,某到此一游😎

Theme Jasmine by Kent Liao

本网站由 又拍云 提供CDN加速/云存储服务

鄂ICP备2023005457号    鄂公网安备 42011302000815号