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()
{
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);
auto stdout_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
stdout_sink->set_level(spdlog::level::trace);
std::vector<spdlog::sink_ptr> sinks{ rotating_sink, stdout_sink };
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");
logger->flush_on(spdlog::level::err);
spdlog::flush_every(std::chrono::seconds(5));
spdlog::register_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__)