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

需求:

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

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());

相关推荐

  1. 超级C++实用日志

    2024-02-02 04:04:02       36 阅读
  2. 05_c/c++开源 spdlog日志

    2024-02-02 04:04:02       37 阅读
  3. c++11线使用】

    2024-02-02 04:04:02       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-02 04:04:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-02 04:04:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-02 04:04:02       82 阅读
  4. Python语言-面向对象

    2024-02-02 04:04:02       91 阅读

热门阅读

  1. 数据库管理-第142期 DBA?DBA!(20240131)

    2024-02-02 04:04:02       40 阅读
  2. Python实现TCP和UDP通信

    2024-02-02 04:04:02       50 阅读
  3. Pinia|VUe的状态管理库

    2024-02-02 04:04:02       58 阅读
  4. qDebug()打印QString去除引号的三种方式

    2024-02-02 04:04:02       49 阅读
  5. CSS Transition(过渡效果)详解

    2024-02-02 04:04:02       50 阅读
  6. C++(20):通过concept及nlohmann将数据转换为字符串

    2024-02-02 04:04:02       51 阅读
  7. C语言-算法-树状数组

    2024-02-02 04:04:02       50 阅读
  8. AOP使用案例

    2024-02-02 04:04:02       47 阅读
  9. python:lxml 生成思维导图 Freemind(.mm)文件

    2024-02-02 04:04:02       72 阅读