mobile wallpaper 1
mobile wallpaper 2
mobile wallpaper 3
mobile wallpaper 4
338 字
1 分钟
spdlog使用方式 C++
2025-08-12

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");
}
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

spdlog使用方式 C++
https://ericonline.cn/posts/spdlog使用方式-c/
作者
Eric
发布于
2025-08-12
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录