分享一个好用的线程安全的c++ 日志库(spdlog)

需求:

线程安全,简单易用的跨平台日志库。

GitHub - gabime/spdlog: Fast C++ logging library.

使用:

1,将源码加到工程中。

分享一个好用的线程安全的c++ 日志库(spdlog)_第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 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();
			auto file_sink = std::make_shared(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 sinks;
			sinks.push_back(console_sink);
			sinks.push_back(file_sink);

			m_logger = std::make_shared("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 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());

你可能感兴趣的:(C++,安全,c++,开发语言,spdlog)