spdlog默认彩色日志在支持ANSI转义序列的终端下生效,如Linux/macOS终端、Windows Terminal、WSL、Git Bash;传统cmd.exe默认不支持,需手动启用ENABLE_VIRTUAL_TERMINAL_PROCESSING。

spdlog默认彩色日志在哪些终端下生效
spdlog的stdout_color_mt和stderr_color_mt日志器默认只在支持ANSI转义序列的终端中输出彩色日志,比如Linux/macOS终端、Windows Terminal、WSL、Git Bash。传统Windows命令提示符(cmd.exe)默认不启用ANSI支持(即使Win10+也需手动开启),所以直接运行可能看到的是纯白日志或乱码。
验证方式:运行echo "\x1b[32mGREEN\x1b[0m",若显示绿色文字则终端支持;否则需先调用SetConsoleMode启用ENABLE_VIRTUAL_TERMINAL_PROCESSING(Windows平台)。
如何创建带颜色的日志器并确保颜色生效
最简可靠做法是显式使用stdout_color_mt工厂函数,并确认日志级别与颜色映射未被覆盖:
-
auto console = spdlog::stdout_color_mt("console");—— 这会自动绑定默认颜色方案(debug=青色、info=白色、warn=黄色、error=红色、critical=粗红底白) - 避免后续调用
console->set_pattern()时误删颜色标记,如%^(开始颜色)、%$(重置颜色)必须成对出现 - 若自定义pattern,务必包含
%^和%$,例如:console->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] %v");
Windows cmd下彩色日志不显示的修复方法
在程序启动早期(日志器创建前)调用系统API启用虚拟终端支持:
立即学习“C++免费学习笔记(深入)”;
#ifdef _WIN32 #include <windows.h> HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); DWORD dwMode = 0; GetConsoleMode(hOut, &dwMode); SetConsoleMode(hOut, dwMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING); #endif
注意:该调用只需一次,且必须在spdlog::stdout_color_mt创建之前执行;如果用的是stderr_color_mt,则需对STD_ERROR_HANDLE同样处理。
颜色方案能否自定义及常见陷阱
可以,但别直接改spdlog::level::level_enum对应的ANSI码——应通过spdlog::color_mode::always + 自定义formatter控制,或使用spdlog::sinks::stdout_color_sink_mt::set_color()逐级设置:
-
sink->set_color(spdlog::level::warn, spdlog::colors::yellow);—— 正确 - 不要在多线程环境下反复调用
set_color,它非线程安全;应在日志器构建完成后一次性配置 - 若同时使用多个sink(如console+file),文件sink默认忽略颜色标记,无需也不应为其设颜色
- 某些IDE内置终端(如CLion、VS Code集成终端)可能截断或过滤ANSI序列,建议优先在外部终端验证
颜色不是万能的——当输出重定向到文件或管道(./app > log.txt)时,stdout_color_mt会自动退化为无色模式,这是设计行为,不是bug。


















