spdlog 封装为 DLL

该博客介绍了在项目中遇到boost::log导致的崩溃问题后,转向使用spdlog作为日志库的体验。作者发现spdlog不仅速度快,内存占用小,而且提供了C风格的字符串格式化语法,支持同步/异步和滚动日志。博客还给出了一个使用spdlog封装的C++类,详细展示了如何配置和使用该日志库。在程序退出前,需要调用shutdown()方法关闭日志。示例代码展示了如何创建和使用日志实例。

项目中需要快速写入巨量日志,一开始用的是boost::log,但遇到崩溃问题,程序负载大了,滚动日志时偶尔会崩溃,总是报:
boost::filesystem_errorbad_year, bad_month 一些问题。在boost官网,和github上的 boostlog 项目 issue中窥见些端倪,说是boost::filesystem存在问题blabla
枉我还一直很信任 boost ,还是换个日志库吧。

github 上 spdlog 星星比 boost::log 多多了,boost::log 好像用的人挺少。

这一换发现:相比boost::log,spdlog 速度又快,占内存又小(取决于队列长度)

使用 spdlog1.10.0 封装的 dll

  • 使用这个dll,你的项目不用再依赖 spdlog 头文件
  • C 风格的字符串格式化语法
  • 同步/异步、滚动日志
  • 程序退出前需要调用静态方法 shutdown()
  • VS2019 编译通过
    在这里插入图片描述
// log_spd.h
#pragma once
#include <string>
#ifndef LOG_LIB_H
#define LOG_LIB_H

#ifdef _MSC_VER
#define LOG_API _declspec(dllexport)
#else
#define LOG_API 
#endif

class SpdlogWrapper;

enum class lv {
   
   
    trace,
    debug,
    info,
    warn,
    error,
    fatal
};

class LOG_API Logger
{
   
   
public:
    Logger();
    Logger(const std::string& file, lv level=lv::trace, int rotateFileSize=100 /* MB */, int rotateFileCount=5);
    Logger(const Logger&);
    Logger& operator=(const Logger&);
    ~Logger();

    // 返回一个日志对象
    static Logger createLogger(const std::string& filename, lv level=lv::trace, int rotateFileSize=100 /* MB */, int rotateFileCount=5);

    // 全局设置。定时写日志到文件。0 秒则不启用
    static void setFlushEverySec(int sec);

    // 设置日志文件
    void setFileName(const std::string&);

    // 设置日志前缀格式;default: [%Y-%m-%d %H:%M:%S.%e][%t][%l] %v
    void setFormat(const std::string&);

    // 设置日志等级,大于此等级才写入文件
    void setLevel(lv);

    // 设置滚动日志文件
    void setRotateFile(int size /* MB */, int count);

    // 设置立即写到文件的日志等级
    void setFlushOnLevel(lv);

    // 是否异步日志,default: true
    void setAsyncMode(bool);

    // 设置异步日志队列长度。默认 256。经测试,队列更长,占用内存更大,未见性能明显提升
    void setAsyncQueueSize(int);

    // 在调用 setXX 类函数之后,最后调用 init(); 赋值操作后,被赋值的对象需要重新 init()
    void init();
    void init(const std::string& file, lv level=lv::trace, int rotateFileSize=100 /* MB */, int rotateFileCount=5);

    // 格式化后的字符串最大长度: 1024
    void trace(const char* fmt, ...);
    void info(const char* fmt, ...);
    void debug(const char* fmt, ...);
    void warn(const char* fmt, ...);
    void error(const char* fmt, ...);
    void fatal(const char* fmt, ...);

    // 异步模式:通知缓冲, 要求写入日志文件;
    // 同步模式:立即写入日志文件
    void flush();

    // EXE 主程序退出前需要调用。因为 spdlog 在 windows 上存在问题关不掉程序
    // 如果是在 dll 中使用此日志库,你的 dll 需要提供接口来让 EXE 程序在退出前主动调用到此函数
    static void shutdown();

private:
    SpdlogWrapper* m_logWrapper;
};


#
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值