spdlog的简单使用

1.spdlog简介

spdlog 是一个快速、异步的、header-only 的 C++ 日志库。它提供了简单易用的 API 并具有高性能和可扩展性。

2.代码示例

#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/daily_file_sink.h>
#include <spdlog/async.h>

int main() {
    // 1. 基本控制台日志
    spdlog::info("=== 基础控制台日志 ===");
    spdlog::debug("调试信息");
    spdlog::info("普通信息");
    spdlog::warn("警告信息");
    spdlog::error("错误信息");
    spdlog::critical("严重错误");

    // 2. 设置全局日志级别
    spdlog::set_level(spdlog::level::debug);  // 显示debug及以上级别
    spdlog::debug("现在可以看到调试信息了");

    // 3. 格式化输出
    int apples = 5;
    double price = 4.99;
    spdlog::info("我有 {} 个苹果,每个 ${:.2f}", apples, price);
    spdlog::warn("{:*^40}", " 重要警告 ");  // 居中填充

    // 4. 创建文件日志器
    auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/basic.txt");
    file_logger->info("这条日志会保存到文件");
    
    // 5. 带旋转的文件日志 (防止文件过大)
    auto rotating_logger = spdlog::rotating_logger_mt("rotating", "logs/rotating.txt", 1024 * 1024, 5);
    for (int i = 0; i < 1000; ++i) {
        rotating_logger->info("旋转日志测试 #{}", i);
    }

    // 6. 每日日志文件 (每天创建新文件)
    auto daily_logger = spdlog::daily_logger_mt("daily", "logs/daily.txt");
    daily_logger->info("每天一个新日志文件");

    // 7. 自定义日志格式
    spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [%n] %v");
    spdlog::info("自定义格式的日志");

    // 8. 创建带颜色的控制台日志器
    auto console = spdlog::stdout_color_mt("console");
    console->set_level(spdlog::level::debug);
    console->info("带颜色的控制台输出");
    console->error("红色错误信息");

    // 9. 多Sink组合日志器 (控制台+文件)
    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/multi.txt");
    spdlog::logger multi_logger("multi", {console_sink, file_sink});
    multi_logger.set_pattern("%+");  // 使用默认格式
    multi_logger.warn("这条消息同时输出到控制台和文件");

    // 10. 异步日志 (高性能场景)
    spdlog::init_thread_pool(8192, 1);  // 队列大小,线程数
    auto async_logger = spdlog::create_async<spdlog::sinks::basic_file_sink_mt>(
        "async_logger", "logs/async.txt");
    for (int i = 0; i < 100; ++i) {
        async_logger->info("异步日志消息 #{}", i);
    }

    // 11. 刷新策略
    spdlog::flush_every(std::chrono::seconds(3));  // 每3秒刷新一次
    spdlog::get("file_logger")->flush();  // 手动刷新特定日志器

    // 12. 错误处理
    try {
        auto bad_logger = spdlog::basic_logger_mt("bad", "/invalid/path/log.txt");
    } catch (const spdlog::spdlog_ex& ex) {
        spdlog::error("日志器创建失败: {}", ex.what());
    }

    // 13. 全局注册和获取日志器
    auto global_logger = spdlog::get("console");
    if (global_logger) {
        global_logger->info("通过名称获取已注册的日志器");
    }

    // 14. 设置全局日志器
    spdlog::set_default_logger(spdlog::get("multi"));
    spdlog::info("这条消息使用默认日志器输出");

    // 15. 日志级别检查
    if (spdlog::should_log(spdlog::level::debug)) {
        spdlog::debug("条件日志:当前级别允许调试信息");
    }

    // 程序结束前清理
    spdlog::shutdown();
    return 0;
}

3.运行结果

image-20250712170254227

4.总结

功能 说明 适用场景
基础控制台日志 使用默认日志器输出到控制台 快速调试、简单应用
日志级别控制 设置全局或单个日志器的显示级别 生产环境过滤调试信息
格式化输出 使用 {} 占位符格式化复杂消息 动态内容日志
文件日志 持久化日志到文件 生产环境日志记录
旋转文件日志 限制单个文件大小,自动创建新文件 防止日志文件过大
每日文件日志 每天创建新的日志文件 按天归档日志
自定义格式 灵活组合时间、级别、名称等信息 统一日志格式规范
彩色控制台输出 不同级别显示不同颜色 开发环境调试
多Sink组合 同时输出到多个目标(控制台+文件+网络等) 复杂日志分发需求
异步日志 使用后台线程处理日志,减少主线程阻塞 高性能应用、低延迟场景
自动刷新策略 定时或定量自动刷新缓冲区 防止日志丢失
异常处理 捕获并记录日志系统自身的错误 增强系统稳定性
全局日志器管理 注册、获取和设置默认日志器 跨模块统一日志管理
条件日志 在日志前检查级别避免不必要的计算 高性能场景优化
posted @ 2025-07-12 17:10  桂洛克船长  阅读(75)  评论(0)    收藏  举报