spdlog使用可变参数宏封装

spdlog使用可变参数宏封装使用


1. 头文件

#include <mutex>

#include <spdlog/spdlog.h>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>

2. 全局定义

static const int MAX_BUF = 1024;
char g_dataBuf[MAX_BUF];

std::mutex g_logMutex;

3. 初始化

void initSpdLog()
{
    // 日志文件sink,循环保存最多10个日志文件,超时3MB自动创建新文件
    auto rotating_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("logs/sdk_log/log.txt", 1048576 * 3, 10, false);
    rotating_sink->set_level(spdlog::level::info);

    // 控制台输出sink
    auto stdout_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
    stdout_sink->set_level(spdlog::level::trace);

    // sinks
    std::vector<spdlog::sink_ptr> sinks{ rotating_sink, stdout_sink };

    // 创建logger
    auto logger = std::make_shared<spdlog::logger>("default", std::begin(sinks), std::end(sinks));

    // 设置日志格式
    logger->set_pattern("[%C-%m-%d %T:%e] [%l] [%t] %v");

    // 设置日志文件写入策略:err以上等级立即写入、每5秒写入一次
    logger->flush_on(spdlog::level::err);
    spdlog::flush_every(std::chrono::seconds(5));

    // 为当前库注册logger
    spdlog::register_logger(logger);

    // 设置当前库的默认logger
    spdlog::set_default_logger(logger);

    // 初始化日志缓冲
    memset(g_dataBuf, 0, sizeof (g_dataBuf));
}

4. 日志输出

void sdklog_print(int level, const char *file, int line, const char *argList, ...)
{
    static const spdlog::level::level_enum spdLevels[] = {
        spdlog::level::debug,
        spdlog::level::info,
        spdlog::level::warn,
        spdlog::level::err,
        spdlog::level::critical
    };
    auto spdLevel = spdLevels[static_cast<int>(level)];

    g_logMutex.lock();

    memset(g_dataBuf, 0, sizeof (g_dataBuf));

    va_list args;
    va_start(args, argList);
    vsnprintf(g_dataBuf, MAX_BUF, argList, args);
    va_end(args);

    g_logMutex.unlock();

    spdlog::default_logger_raw()
        ->log(spdlog::source_loc{file, line, SPDLOG_FUNCTION}, spdLevel, g_dataBuf);
}

5. 宏定义

#ifdef NDEBUG
#   define SDK_LOG_DEBUG(fmt, ...)   (void)0
#else
#   define SDK_LOG_DEBUG(fmt, ...)   sdklog_print(0, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
#endif

#define SDK_LOG_INFO(fmt, ...)       sdklog_print(1, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define SDK_LOG_WARN(fmt, ...)       sdklog_print(2, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define SDK_LOG_ERROR(fmt, ...)      sdklog_print(3, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define SDK_LOG_CRITICAL(fmt, ...)   sdklog_print(4, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperYang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值