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");

浙公网安备 33010602011771号