日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

spdlog源码阅读 (1): sinks

發布時間:2023/11/27 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spdlog源码阅读 (1): sinks 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0. spdlog簡單介紹

spdlog 是一個快速的 C++ 日志庫,只包含頭文件,兼容 C++11。項目地址
特性:

  • 非常快
  • 只包含頭文件
  • 無需依賴第三方庫
  • 支持跨平臺 - Linux / Windows on 32/64 bits
  • 支持多線程
  • 可對日志文件進行循環輸出
  • 可每日生成日志文件
  • 支持控制臺日志輸出
  • 可選的異步日志
  • 支持日志輸出級別
  • 可自定義日志格式
    (上述內容來源于 開源中國關于spdlog的介紹)

1. sinks

在spdlog中,sink指向實際的輸出目標,例如

  1. stdout
  2. syslog(linux系統日志)
  3. ostream
  4. file
  5. ...
    代碼路徑: spdlog-master/include/spdlog/sinks

1.1 sink

class sink
{
public:sink(){_level = level::trace;}virtual ~sink() {}virtual void log(const details::log_msg& msg) = 0;virtual void flush() = 0;bool should_log(level::level_enum msg_level) const;void set_level(level::level_enum log_level);level::level_enum level() const;private:level_t _level;
};

sink類的兩個純虛函數 log flush 是子類需要實現的接口。

1.2 base_sink

沒啥好說的直接上代碼,這里僅列出主要內容。

template<class Mutex>
class base_sink:public sink
{
public://.....void log(const details::log_msg& msg) override{std::lock_guard<Mutex> lock(_mutex);_sink_it(msg);}protected:virtual void _sink_it(const details::log_msg& msg) = 0;Mutex _mutex;
};

模板類**base_sink繼承sink,同時實現了log接口,通過Mutex決定類是工作在單線程
還是多線程下。而子類通過實現接口_sink_it輸出日志。

在spdlog中,如果在多線程中base_sink形式如下:base_sink<std::mutex>;
單線程:base_sink<spdlog::details::null_mutex>;

而null_mutex什么都不做。

1.3 rotating_file_sink

通過文件饒接這個例子看下在spdlog中具體的sink是怎么實現的。

template<class Mutex>
class rotating_file_sink : public base_sink < Mutex >
{
public://......
protected:void _sink_it(const details::log_msg& msg) override{_current_size += msg.formatted.size();if (_current_size > _max_size){_rotate();_current_size = msg.formatted.size();}_file_helper.write(msg);}private://......void _rotate(){for (auto i = _max_files; i > 0; --i){// 修改文件名,轉儲文件//......}//......
};
typedef rotating_file_sink<std::mutex> rotating_file_sink_mt;
typedef rotating_file_sink<details::null_mutex>rotating_file_sink_st;

_sink_it實現了在文件超過限制后通過_rotate轉儲文件,同時使用文件進行輸出。輸出的對象是msg(
實際的日志內容)。
代碼的最后兩行分別定義了rotating_file_sink_mt和rotating_file_sink_st。前者使用在多線程中,
后者使用在單線程。其中的區別在1.2中已經說明。

轉載于:https://www.cnblogs.com/eskylin/p/6483199.html

總結

以上是生活随笔為你收集整理的spdlog源码阅读 (1): sinks的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。