338 字
1 分钟
spdlog使用方式 C++
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 message4. 输出到文件
#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/ 部分信息可能已经过时
相关文章 智能推荐