本文目录
1. 简介
spdlog
是一个非常高性能、header-only(仅头文件)的 C++ 日志库。它具有以下特点:
- 极快:基于
fmt
格式化库,性能非常高。 - 多种日志输出方式:控制台、文件、异步日志等。
- 易用:API 简洁,几乎零配置即可使用。
- 线程安全:默认多线程安全版本,也支持单线程版本。
GitHub 项目地址:https://github.com/gabime/spdlog
2. 安装 spdlog
2.1 方式一:直接使用头文件
spdlog
是 header-only 库,直接将 include/spdlog
文件夹拷贝到项目中即可。
2.2 方式二:CMake 引入(推荐)
# 使用 FetchContent 引入
include(FetchContent)
FetchContent_Declare(
spdlog
GIT_REPOSITORY https://github.com/gabime/spdlog.git
GIT_TAG v1.12.0
)
FetchContent_MakeAvailable(spdlog)
# 链接到项目
target_link_libraries(my_app PRIVATE spdlog::spdlog)
或者通过系统包管理器安装:
sudo apt install libspdlog-dev
3. 基本用法
#include <spdlog/spdlog.h>
int main() {
// 输出到控制台
spdlog::info("Hello, {}!", "World");
spdlog::warn("Warning message");
spdlog::error("Error message");
// 设置日志级别(默认 info)
spdlog::set_level(spdlog::level::debug);
spdlog::debug("This is a debug message");
return 0;
}
输出示例:
[2025-08-12 10:30:45.123] [info] Hello, World!
[2025-08-12 10:30:45.124] [warning] Warning message
[2025-08-12 10:30:45.124] [error] Error message
4. 输出到文件
#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>
int main() {
auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/my_log.txt");
file_logger->info("Log message to file");
file_logger->warn("Warning to file");
file_logger->error("Error to file");
}
默认会覆盖日志文件,可以在构造时传入 true 表示追加模式
auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/my_log.txt", true);
5.同时输出到控制台和文件
#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
int main() {
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/multisink.txt", true);
console_sink->set_pattern("[%Y-%m-%d %H:%M:%S] [%^%l%$] %v");
file_sink->set_pattern("[%Y-%m-%d %H:%M:%S] [%l] [%s:%#] %v");
spdlog::logger logger("multi_logger", {console_sink, file_sink});
logger.set_level(spdlog::level::debug);
logger.info("Log to console and file");
logger.warn("Warning message");
}
6. 设置日志格式
spdlog 提供了非常灵活的格式控制:
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%n] [%^%l%$] [%s:%#] %v");
常用格式占位符:
占位符 | 含义 |
---|---|
%v | 日志内容 |
%n | 日志器名称 |
%l | 日志等级(info, warn, error) |
%t | 线程 ID |
%s | 源文件名 |
%# | 行号 |
%! | 函数名 |
%Y-%m-%d %H:%M:%S | 日期时间 |
%e | 毫秒 |
7. 异步日志(高性能)
#include <spdlog/async.h>
#include <spdlog/sinks/basic_file_sink.h>
int main() {
spdlog::init_thread_pool(8192, 1);
auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/async_log.txt", true);
auto async_logger = std::make_shared<spdlog::async_logger>(
"async_logger", file_sink, spdlog::thread_pool(),
spdlog::async_overflow_policy::block);
spdlog::register_logger(async_logger);
async_logger->info("This is async log message");
}
8. 封装到头文件(推荐)
log.h
#pragma once
#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
extern std::shared_ptr<spdlog::logger> logger;
void init_logger(const std::string &log_path = "logs/app.log",
spdlog::level::level_enum level = spdlog::level::info);
#define LOG_INFO(...) logger->info(__VA_ARGS__)
#define LOG_WARN(...) logger->warn(__VA_ARGS__)
#define LOG_ERROR(...) logger->error(__VA_ARGS__)
#define LOG_DEBUG(...) logger->debug(__VA_ARGS__)
log.cpp
#include "log.h"
std::shared_ptr<spdlog::logger> logger;
void init_logger(const std::string &log_path, spdlog::level::level_enum level) {
auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(log_path, true);
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
file_sink->set_pattern("[%Y-%m-%d %H:%M:%S] [%s:%#] %v");
console_sink->set_pattern("[%Y-%m-%d %H:%M:%S] [%^%l%$] %v");
logger = std::make_shared<spdlog::logger>("multi_sink", spdlog::sinks_init_list{file_sink, console_sink});
logger->set_level(level);
}
使用:
#include "log.h"
int main() {
init_logger("logs/my_app.log", spdlog::level::debug);
LOG_INFO("App started");
LOG_WARN("Low disk space");
LOG_ERROR("Something went wrong");
}