C++

spdlog使用方式 C++


avatar
GuoYulong 2025-08-12 86

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

相关阅读

注意!!!

站点域名更新!!!部分文章图片等由于域名问题无法显示!!!

通知!!!

站点域名更新!!!部分文章图片等由于域名问题无法显示!!!