需求:
线程安全,简单易用的跨平台日志库。
GitHub - gabime/spdlog: Fast C++ logging library.
使用:
1,将源码加到工程中。
2,封装成成一个单例模式,在任何需要使用的地方,直接调用即可。
#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"
#include "spdlog/sinks/rotating_file_sink.h"
#include "spdlog/async.h"
#include "spdlog/sinks/stdout_color_sinks.h"
static inline int NowDateToInt()
{
time_t now;
time(&now);
tm p;
localtime_s(&p, &now);
int now_date = (1900 + p.tm_year) * 10000 + (p.tm_mon + 1) * 100 + p.tm_mday;
return now_date;
}
static inline int NowTimeToInt()
{
time_t now;
time(&now);
tm p;
localtime_s(&p, &now);
int now_int = p.tm_hour * 10000 + p.tm_min * 100 + p.tm_sec;
return now_int;
}
class XLogger
{
public:
static XLogger* getInstance()
{
static XLogger xlogger;
return &xlogger;
}
std::shared_ptr<spdlog::logger> getLogger()
{
return m_logger;
}
private:
XLogger()
{
try
{
int date = NowDateToInt();
int time = NowTimeToInt();
const std::string logger_name = "./algorithmLog/" + std::to_string(date) + ".log";
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(logger_name, 100 * 1024 * 1024, 1000);
console_sink->set_pattern("%Y-%m-%d %H:%M:%S.%f [%l] [%@] %v");
file_sink->set_pattern("%Y-%m-%d %H:%M:%S.%f [%l] [%@] %v");
console_sink->set_level(spdlog::level::trace);
file_sink->set_level(spdlog::level::trace);
std::vector<spdlog::sink_ptr> sinks;
sinks.push_back(console_sink);
sinks.push_back(file_sink);
m_logger = std::make_shared<spdlog::logger>("multi-sink", begin(sinks), end(sinks));
m_logger->set_level(spdlog::level::trace);
m_logger->flush();
}
catch (const spdlog::spdlog_ex& ex)
{
std::cout << "Log initialization failed: " << ex.what() << std::endl;
}
}
~XLogger()
{
spdlog::drop_all();
}
void* operator new(size_t size)
{}
XLogger(const XLogger&) = delete;
XLogger& operator=(const XLogger&) = delete;
private:
std::shared_ptr<spdlog::logger> m_logger;
};
#define LOGT(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::trace, __VA_ARGS__)
#define LOGD(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::debug, __VA_ARGS__)
#define LOGI(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::info, __VA_ARGS__)
#define LOGW(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::warn, __VA_ARGS__)
#define LOGE(...) SPDLOG_LOGGER_CALL(XLogger::getInstance()->getLogger().get(), spdlog::level::err, __VA_ARGS__)
3,调用 单例
LOGE("卸载算法异常 {}", e.what());
LOGI("注册算法 算法ID:{} 算法名称:{} 插件版本:{} ", id, plugin->PluginName(), plugin->PluginVer());