CMake 编译报 fatal error: spdlog/spdlog.h: No such file or directory,多半是依赖装了但没 link。spdlog 是 C++ 里常用的日志库,以头文件为主,接入不难,难在选同步还是异步。

vcpkg 或 conan 装完,CMakeLists 里写 find_package(spdlog CONFIG REQUIRED),再加 target_link_libraries(app PRIVATE spdlog::spdlog)。不想引包管理,也可以把头文件目录加进 include path,只用 header-only 模式。

vcpkg install spdlog; cmake --build build

同步够用的场景

普通服务、QPS 不高的后台,同步日志完全够。默认的 console logger 和 basic_file_logger 都是同步写,配置简单,出问题也好查。

日志量大时同步写会拖慢业务线程,尤其是每请求打十几行的那种。先量化:一天几个 G,再决定要不要上异步。

异步的队列和丢弃策略

异步模式靠线程池和队列,队列满时按策略处理,默认是阻塞等待,业务线程会跟着卡住。这个默认行为很多人不知道,压测时发现接口变慢才回头查。

初始化时设队列大小和线程数,程序退出前调用 spdlog::shutdown(),否则队列里没刷完的日志会丢。崩溃场景另说,异步本来就不保证。多线程写同一个 logger 是线程安全的,别自己再加锁。不同模块想分开文件,就按模块建多个 logger,名字重复会抛异常。Linux 上编译记得加 -pthread,漏了会在链接阶段报错。

滚动和格式

rotating_logger_mt 按文件大小滚动,daily_logger_mt 按天切。格式串里 %Y-%m-%d %H:%M:%S.%e 是时间,%l 是级别,%v 是正文,别把顺序写乱。

选型判断:小项目同步加滚动文件就够;高并发再上异步,并且把队列满的策略和退出刷新写进代码,别只改个构造函数。