C++日志模板库SPDLog的使用

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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值