一个支持彩色控制台输出和日志文件写入的轻量级 C/C++ 日志库。

平台支持
- Windows (tested on Windows 7, Windows 10 and Windows 11)
- Linux (tested on Ubuntu and Kali)
Windows 版本仅支持 MSVC 工具链,不支持 GCC/MinGW。
使用示例
1 | #include "KlyLogger.hpp" int main() { // 初始化日志器 KlyLogger logger; // 默认日志器 // 日志示例 logger.info(L"Application started: {}", L"MyApp"); std::string user = "Lucy"; std::wstring action = L"logged in"; logger.info("User {} {}", user, action); // string 与 wstring 混用 logger.warn(L"Low memory warning: {} MB left", 100); logger.error(L"File not found: {}", "config.txt"); logger.fatal(L"Unexpected crash!"); // Minecraft 风格彩色字符示例 // Example: §c red, §a green, §e yellow, §b aqua, §f white, §5 purple KlyLogger("Colorful").info(L"§c红色 §a绿色 §e黄色 §b水蓝色 §f白色 §5紫色"); return 0; } |
C 接口
C 头文件通过 opaque handle 保留日志器对象。C11 _Generic 让静态库能够保留参数类型,并应用 fmt 风格的 {} 格式化。
默认 C API 使用宽字符串,窄字符串 API 使用 _narrow 后缀。
1 | #include "KlyLogger.h" int main(void) { KlyLogger logger = kly_logger_create_named(L"C_App"); const char *narrow_user = "Lucy"; if (!logger) return 1; kly_logger_info(logger, L"Application started"); kly_logger_info(logger, L"User {} has {:04} points; pi={:.2f}", L"Lucy", 42, 3.14159); // 普通 char 字符串作为格式参数时需要显式标记 kly_logger_info(logger, L"Narrow user: {}", KLY_STRING_ARG(narrow_user)); kly_logger_warn_narrow(logger, "Narrow text: {}; value: {}", KLY_STRING_ARG("warning"), 7); kly_logger_wait(); return 0; } |
同一组 info、warn、error、fatal 名称既可接收普通消息,也可在格式串后直接接收最多 16 个参数。
C11 _Generic 会保留每个参数的类型,宏会自动计算参数数量,因此用户不需要构造类型标记数组、手写参数数量或调用单独的 _format 函数。
遇到少见类型或需要精确控制转换时,仍可使用 KLY_INT_ARG 等显式构造宏。
在少数 wchar_t 与 char 属于兼容类型的 C 实现中,两种指针无法同时写入同一个 _Generic 关联列表。
KlyLogger 会优先将这个有歧义的类型视为 wchar_t *;窄字符串参数请显式写成 KLY_STRING_ARG(value)。
在 wchar_t 与 char 类型不同的常规平台上,两者仍会被自动识别。
C 格式化接口支持 {}、{1} 等位置参数、{:08x} 和 {:.2f} 等普通格式说明,{{`、`}} 转义花括号,以及 {0:{1}}、{0:.{1}f} 这类嵌套动态宽度或精度。
C 的类型标记参数会传入 fmt 的动态参数存储,完整格式字符串只进行一次格式化。
静态库构建
1 | git clone --recursive https://github.com/KinnerFisch/KlyLogger cd KlyLogger mkdir build cmake -S . -B build cmake --build build --config Release |
使用 CMake 时直接链接所选目标。
Windows 下请选择后缀与应用程序运行库 (/MD 或 /MT) 匹配的目标。
1 | add_subdirectory(path/to/KlyLogger) if(MSVC) target_link_libraries(your_target PRIVATE KlyLogger::KlyLogger_MD) # /MD # target_link_libraries(your_target PRIVATE KlyLogger::KlyLogger_MT) # /MT else() target_link_libraries(your_target PRIVATE KlyLogger::KlyLogger) endif() |
所有适用的组合会同时生成。Windows 下每行都会生成 MD、MT 两份。
由于输出句柄缓存是 Windows 特有行为,Linux 仅构建默认目标和 NoLogFile 目标。
| Log file | Handle cache | Windows CMake targets | Windows libraries | Linux target / archive |
|---|---|---|---|---|
| Enabled | Enabled | KlyLogger::KlyLogger_MD, KlyLogger::KlyLogger_MT | KlyLogger_MD.lib, KlyLogger_MT.lib | KlyLogger::KlyLogger / libKlyLogger.a |
| Disabled | Enabled | KlyLogger::NoLogFile_MD, KlyLogger::NoLogFile_MT | KlyLoggerNoLogFile_MD.lib, KlyLoggerNoLogFile_MT.lib | KlyLogger::NoLogFile / libKlyLoggerNoLogFile.a |
| Enabled | Disabled | KlyLogger::NoOutputHandleCache_MD, KlyLogger::NoOutputHandleCache_MT | KlyLoggerNoOutputHandleCache_MD.lib, KlyLoggerNoOutputHandleCache_MT.lib | Not built |
| Disabled | Disabled | KlyLogger::NoLogFileNoOutputHandleCache_MD, KlyLogger::NoLogFileNoOutputHandleCache_MT | KlyLoggerNoLogFileNoOutputHandleCache_MD.lib, KlyLoggerNoLogFileNoOutputHandleCache_MT.lib | Not built |
输出句柄缓存是 Windows 特有行为,因此 Linux 不生成用于禁用该行为的变体。
手动链接 C API 时请使用 C++ 链接器驱动,或显式加入平台的 C++ 运行库,因为静态库的内部实现使用 C++。
主要功能
- 多线程安全操作
- 控制台彩色输出
- 同时支持控制台和文件日志
- 提供默认和自定义名称日志器, 开箱即用
- 提供简单易用的 {fmt} 格式化,支持动态宽度与精度
- 支持类似 Minecraft 的彩色字符输出
- 支持多种日志等级:info, warn, error, fatal
- 支持
std::string与std::wstring混合使用 - 所有日志文件会自动保存到程序所在位置(非工作目录)下的
logs文件夹中⚠️ 注意:不建议在
std::string中使用非 ASCII 字符, 避免解码出现乱码
许可证与第三方软件
KlyLogger 使用 Boost Software License 1.0 发布。
格式化实现使用 {fmt},版权归 Victor Zverovich 及 {fmt} 贡献者所有,并使用 MIT 许可证。
fmt 的完整许可文本保留于 fmt/LICENSE 和 THIRD_PARTY_NOTICES.md,
CMake 安装静态库时也会一并安装这些许可证文件。
灵感来源
KlyLogger 的日志输出格式灵感来自知名的 Minecraft 服务器项目 PaperMC,并在此基础上根据个人喜好进行了颜色与视觉样式的改进。
同时,这也是本人踏入现代化 C++ 开发的入门作品。