SPDLog是一个基于C++11 的开源模版库,其功能是日志输出,代码托管在 https://github.com/gabime/spdlog 。它注重速度和易用性,支持跨平台、丰富的日志级别、自定义格式、多目标输出和线程安全。它支持的平台包括Windows、Linux、Mac、Android。
以下的C++ Log类对SPDLog进行了简易的封装,实现了向标准输出(可选)和日志文件的日志输出,日志文件名按照日期定义。
# Log.h
#ifndef LOG_H
#define LOG_H
#include <memory>
#include <QMutex>
#include "spdlog/spdlog.h"
#include "spdlog/sinks/ansicolor_sink.h"
#include "spdlog/sinks/daily_file_sink.h"
class Log
{
public:
Log();
Log(const Log&) = delete;
Log& operator=(const Log&) = delete;
virtual ~Log();
/** 日志模块初始化
*/
static int Init(bool showInConsole);
/** 日志模块释放资源
*/
static void Finit();
public:
/** 输出日志
*/
template<typename... Args>
void ToLog(const char * fmt, Args... args)
{
QMutexLocker lock(&Log::ClassMutex);
if(Log::Logger == nullptr)
return;
Log::Logger->debug(fmt, args...);
}
private:
static QMutex ClassMutex;
static std::shared_ptr<spdlog::logger> Logger;
};
#endif // LOG_H
# Log.cpp
#include <QCoreApplication>
#include "Log.h"
QMutex Log::ClassMutex;
std::shared_ptr<spdlog::logger> Log::Logger;
Log::Log()
{
}
Log::~Log()
{
}
int Log::Init(bool showInConsole)
{
QMutexLocker lock(&Log::ClassMutex);
if(Log::Logger != nullptr)
return 0;
//日志文件所在文件夹:log目录
QString path = QCoreApplication::applicationDirPath() + QString("/log/sigerDC.log");
//日志文件名按日期命名
auto fileSink = std::make_shared<spdlog::sinks::daily_file_sink_st>(path.toStdString().c_str(), 0, 0);
fileSink->set_level(spdlog::level::debug);
fileSink->set_pattern("%H:%M:%S.%e - %v"); //日志输出格式
if(showInConsole) //是否支持向标准输出,输出日志
{
//控制台sink
auto consoleSink = std::make_shared<spdlog::sinks::ansicolor_stdout_sink_st>();
consoleSink->set_level(spdlog::level::debug);
consoleSink->set_pattern("%H:%M:%S.%e %v");
std::vector<spdlog::sink_ptr> sinks;
sinks.push_back(consoleSink);
sinks.push_back(fileSink);
Log::Logger = std::make_shared<spdlog::logger>("Logger", std::begin(sinks), std::end(sinks));
}
else
{
Log::Logger = std::make_shared<spdlog::logger>("Logger", fileSink);
}
Log::Logger->set_level(spdlog::level::debug);
Log::Logger->flush_on(spdlog::level::debug);
return 0;
}
void Log::Finit()
{
QMutexLocker lock(&Log::ClassMutex);
if(Log::Logger == nullptr)
return;
Log::Logger.reset();
spdlog::drop("Logger");
}
只需要将从https://github.com/gabime/spdlog 下载的SPDLog整个代码文件夹添加到项目,然后将以上的Log.h和Log.cpp添加到项目,就可以在代码中使用该类的对象输出日志了:
# main.cpp
#include <QCoreApplication>
#include "Log.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Log::Init(true);
Log log;
log.ToLog("main started");
int ret = app.exec();
Log::Finit();
return ret;
}