C 标准化分级Log,打印多种颜色log

一个控制台项目,如果都在cout中加入[info]等级别,使用同一种颜色感觉不是很方便,所以决定封装一下日志系统

有开源的 EasyLogger 但是需要将全部文件放入到系统中,暂时不需要这么复杂的系统,所以决定直接自己创建一个Logger类,把print封装在其中,打印log时可以根据级,加不同的前缀,使用不同的log颜色,

过程如下:

  • 类.h文件 对外提供初始化和打印两个接口就可以。
  •  1 #pragma once
     2 #ifndef __LOGGER_H__
     3 #define __LOGGER_H__
     4 
     5 namespace Debug {
     6     enum Level {
     7         DBG_LEVEL_NONE = 0,     
     8         DBG_LEVEL_DEBUG,
     9         DBG_LEVEL_INFO,
    10         DBG_LEVEL_WARNING,
    11         DBG_LEVEL_ERROR,
    12     };
    13 
    14     constexpr const char* COLOR_RESET = "\033[0m";      // 白色
    15     constexpr const char* COLOR_RED = "\033[1;31m";     // 红色(错误)
    16     constexpr const char* COLOR_GREEN = "\033[1;32m";   // 绿色(调试)
    17     constexpr const char* COLOR_YELLOW = "\033[1;33m";  // 黄色(警告)
    18     constexpr const char* COLOR_BLUE = "\033[1;34m";    // 蓝色(信息)
    19 
    20     void init();
    21     void log(Level level, const char* format, ...);
    22 }
    23 
    24 #endif

     

  • 类.c文件
  •  1 #include <cstdio>
     2 #include <cstdarg>
     3 #include <unordered_map>
     4 #include <Windows.h>
     5 #include "Logger.h"
     6 
     7 namespace Debug {
     8 
     9     const std::unordered_map<Level, const char*> COLOR_MAP = {
    10         {DBG_LEVEL_ERROR, COLOR_RED},
    11         {DBG_LEVEL_WARNING, COLOR_YELLOW},
    12         {DBG_LEVEL_INFO, COLOR_BLUE},
    13         {DBG_LEVEL_DEBUG, COLOR_GREEN},
    14         {DBG_LEVEL_NONE, COLOR_RESET}
    15     };
    16 
    17     const char* levelToString(Level level) {
    18         switch (level) {
    19         case DBG_LEVEL_ERROR:   return "ERROR";
    20         case DBG_LEVEL_WARNING: return "WARN";
    21         case DBG_LEVEL_INFO:    return "INFO";
    22         case DBG_LEVEL_DEBUG:   return "DEBUG";
    23         default:      return "UNKNOWN";
    24         }
    25     }
    26     static bool enabled = true;
    27     static Level min_level = Level::DBG_LEVEL_DEBUG;
    28 
    29     void init(void)
    30     {
    31         HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
    32         DWORD dwMode = 0;
    33         GetConsoleMode(out, &dwMode);
    34         dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    35         SetConsoleMode(out, dwMode);
    36     }
    37 
    38     void Debug::log(Level level, const char* format, ...) 
    39     {
    40         if (enabled && level >= min_level) {
    41             const char* color = COLOR_MAP.at(level);
    42             printf("%s", color);
    43             printf("[%s] ", levelToString(level));
    44             va_list args;
    45             va_start(args, format);
    46             vprintf(format, args);
    47             va_end(args);
    48             printf("%s\n", COLOR_RESET);
    49         }
    50     }
    51 }
  • 上面init使用的意义是针对Win10可能并没有开启ANSI转义的功能,会直接把COLOR的字符串打印出来,而不是改变log的颜色,所以使用Windows.h 中SetConsoleMode设置ENABLE_VIRTUAL_TERMINAL_PROCESSING,开启彩色log
  • log函数第一参数是log级别,之后可变参数列表传入的就和printf的入参一致,比较好了解。
  • 其中,首先打印通过 unordered_map的at函数获取对应级别的颜色来改变颜色,然后打印级别,之后打印传入的内容,最后打印COLOR_RESET, 将控制台log的颜色恢复初始
  • 使用:
    • 这里创建的Debug是一个Namespace,所以在使用的时候只需要:
    • 1 使用命名空间: using namespace Debug.
    • 2 使用函数:log(DBG_LEVEL_INFO, "FF : Exit");
posted @ 2025-04-21 17:16  JUST_TRY_TO_FIND_IT  阅读(52)  评论(0)    收藏  举报