关于spdlog的基本介绍,可以查看GitHub官方介绍,这里不做过多阐述。主要集中于将spdlog用C++11的特性进行一个封装,简化使用或替换旧工程的日志库。

spdlog库在不同文件使用的时候,为避免每个文件都需要重新定义一下。所以可把它封装在一个log.h的头文件中,这样,就可以直接使用了。

这里使用了单例的设计模式,避免重复创建。同时,使用了可变参数模板,将参数传入WriteLog通过完美转发std::forward到spdlog里面,因为spdlog本身也是一个可变参数模板。

#pragma once
#include <string>
// spdlog日志库
#include "E:/GitRepo/spdlog/include/spdlog/spdlog.h"
#include "E:/GitRepo/spdlog/include/spdlog/sinks/rotating_file_sink.h"

class loggers
{
public:
	static loggers& GetInstance();
	std::shared_ptr<spdlog::logger> sWriteLog;

private:
	loggers();
};

loggers& loggers::GetInstance()
{
	static loggers mLogger;
	return mLogger;
}

loggers::loggers()
{
	std::string logPath("testlog.log");
	sWriteLog = spdlog::rotating_logger_mt("main", logPath, 1024 * 1024 * 5, 3);
}

template < typename ...Args>
void WriteLog(Args ...var)
{
	auto log = loggers::GetInstance();
	log.sWriteLog->info(std::forward<Args>(var)...);
}

如何使用如下:

//main.cpp
#include "log.h"
#include <iostream>

int main()
{
	WriteLog("test");
	WriteLog("test one {}", 123);
    
	spdlog::info("display on console");
	return 0;
}

可以看到,也可以直接使用spdlog::info("display on console");在终端显示信息。
在这里插入图片描述

这里只是一个简单的封装思路,还可以再进一步扩展。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐