C++基于多設計模式下的同步異步日志系統day2

📟作者主頁:慢熱的陜西人

🌴專欄鏈接:C++基于多設計模式下的同步&異步日志系統

📣歡迎各位大佬👍點贊🔥關注🚓收藏,🍉留言

主要內容實現了日志代碼設計的實用類設計,日志等級設計,日志消息類設計。

在這里插入圖片描述

文章目錄

  • C++基于多設計模式下的同步&異步日志系統day2
    • 1.日志系統框架設計
      • 1.1模塊劃分
      • 1.2模塊關系圖
    • 2.代碼設計
      • 2.1實用類設計
      • 2.2日志等級類設計
      • 2.3日志消息類的設計

C++基于多設計模式下的同步&異步日志系統day2

1.日志系統框架設計

本項?實現的是?個多?志器?志系統,主要實現的功能是讓程序員能夠輕松的將程序運??志信息落地到指定的位置,且?持同步與異步兩種?式的?志落地?式。項?的框架設計將項?分為以下?個模塊來實現。

1.1模塊劃分

  • ?志等級模塊:對輸出?志的等級進?劃分,以便于控制?志的輸出,并提供等級枚舉轉字符串功能。

    1. OFF:關閉
    2. DEBUG:調試,調試時的關鍵信息輸出
    3. INFO:提示,普通的提示性日志信息
    4. WARN:警告,不影響運行,但是需要注意一下的日志
    5. ERROR:錯誤,程序運行出現錯誤的日志
    6. FATAL:致命,一般是代碼異常導致程序無法繼續推進的運行的日志
  • 日志消息模塊:中間存儲日志輸出所需的個各項要素信息

    1. 時間:描述本條日志的輸出時間
    2. 線程ID:描述本條日志是哪個線程輸出的
    3. 日志等級:描述本條日志的等級
    4. 日志數據:本條日志的有效載荷數據
    5. 日志文件名:描述本條日志在哪個源碼文件中輸出的
    6. 日志行號:描述本條日志在源碼文件的哪一行輸出的
  • ?志消息格式化模塊:設置?志輸出格式,并提供對?志消息進?格式化功能

    1. 系統的默認?志輸出格式:%d{%H:%M:%S}%T[%t]%T[%p]%T[%c]%T%f:%l%T%m%n
    2. ->13:26:32 [2343223321] [FATAL] [root] main.c:76套接字創建失敗\n
    3. %d{%H:%M:%S}:表??期時間,花括號中的內容表??期時間的格式
    4. %T:表?制表符縮進
    5. %t:表?線程ID
    6. %p:表??志級別
    7. %c:表??志器名稱,不同的開發組可以創建??的?志器進??志輸出,?組之間互不影響
    8. %f:表??志輸出時的源代碼?件名
    9. %l:表??志輸出時的源代碼?號
    10. %m:表?給與的?志有效載荷數據
    11. %n:表?換?
    12. 設計思想:設計不同的?類,不同的?類從?志消息中取出不同的數據進?處理
  • ?志消息落地模塊:決定了?志的落地?向,可以是標準輸出,也可以是?志?件,也可以滾動?
    件輸出…

    1. 標準輸出:表?將?志進?標準輸出的打印
    2. ?志?件輸出:表?將?志寫?指定的?件末尾
    3. 滾動?件輸出:當前以?件??進?控制,當?個?志?件??達到指定??,則切換下?個?件進?輸出
    4. 后期,也可以擴展遠程?志輸出,創建客?端,將?志消息發送給遠程的?志分析服務器
    5. 設計思想:設計不同的?類,不同的?類控制不同的?志落地?向
  • ?志器模塊:

    1. 此模塊是對以上?個模塊的整合模塊,??通過?志器進??志的輸出,有效降低??的使?難度
    2. 包含有:?志消息落地模塊對象,?志消息格式化模塊對象,?志輸出等級
  • ?志器管理模塊:

    1. 為了降低項?開發的?志耦合,不同的項?組可以有??的?志器來控制輸出格式以及落地?向,因此本項?是?個多?志器的?志系統
    2. 管理模塊就是對創建的所有?志器進?統?管理。并提供?個默認?志器提供標準輸出的?志輸出
  • 異步線程模塊:

    1. 實現對?志的異步輸出功能,??只需要將輸出?志任務放?任務池,異步線程負責?志的落地輸出功能,以此提供更加?效的?阻塞?志輸出

1.2模塊關系圖

image-20240301151659398

2.代碼設計

2.1實用類設計

提前完成?些零碎的功能接?,以便于項?中會?到

  • 獲取系統時間
  • 判斷?件是否存在
  • 獲取?件的所在?錄路徑
  • 創建?錄
/*實用工具類的實現:1.獲取系統時間2.判斷文件是否存在3.獲取文件所在路徑4.創建目錄
*/#include<iostream>
#include<ctime>
#include<unistd.h>
#include<sys/stat.h>namespace xupt
{namespace util{class Date{public:static size_t GetTime(){return (size_t)time(nullptr);}    };class File{public:static bool exist(const std::string &pathname){//確保平臺移植性,我們不是用這個接口//return (access(pathname.c_str(), F_OK) == 0); //F_OK,文件存在且權限允許,返回0,struct st;if(stat(pathname.c_str(), &st) < 0){return false;}return true;}static std::string path(const std::string &pathname){size_t pos = pathname.find_last_of("/\\"); /*從路徑字符串的后面開始尋找第一個/或者\ */if(pos == std::string.npos) return "."; //如果沒有找到,那么證明這個文件就在當前的目錄return pathname.substr(0, pos + 1); //輸出包含最后一個/的位置的字符串}static void CreateDirectory(const std::string &pathname){size_t pos = 0, idx = 0;while(idx < pathname.size()){pos = pathname.find_first_of("/\\"); //尋找第一個/或者\if(pos == std::string.npos){mkdir(pathname, 0777); //如果沒有分隔符,那么就直接創建,并且設置權限為0777}std::string parent_dir = pathname.substr(0, idx + pos + 1); //截取包含從開始到/的父目錄if(exist(parent_dir) == true) { idx = pos + 1; continue; } //如果當前的目錄存在了,那么就跳過去找下一個mkdir(parent_dir, 0777);idx = pos + 1;}}};}
}

2.2日志等級類設計

①日志等級總共分為7個等級,分別為:

  • UNKNOW表示未知錯誤
  • DRBUG進?debug時候打印?志的等級
  • INFO打印?些??提?信息
  • WARN打印警告信息
  • ERROR打印錯誤信息
  • FATAL打印致命信息-導致程序崩潰的信息
  • OFF關閉所有日志輸出

每一個項目中都會設置一個默認的日志輸出等級,只有輸出的日志等級大于等于默認限制等級的時候才可以進行輸出

②提供一個接口,將對應等級的枚舉,轉換為一個對應的字符串。

/*1.定義枚舉類,枚舉出日志等級2.提供轉換接口:將枚舉轉換為對應字符串
*/
#ifndef __M_LEVEL_H__
#define __M_LEVEL_H__namespace xupt
{class LogLevel{public:enum class value{UNKOWN = 0,DEBUG,INFO,WARN,ERROR,FATAL,OFF};static const char* toString(LogLevel::value level){switch (level){case LogLevel::value::DEBUG: return "DEBUG";case LogLevel::value::INFO: return "INFO";case LogLevel::value::WARN: return "WARN";case LogLevel::value::ERROR: return "ERROR";case LogLevel::value::FATAL: return "FATAL";case LogLevel::value::OFF: return "OFF";}return "UNKOWN";}};
}#endif

2.3日志消息類的設計

?志消息類主要是封裝?條完整的?志消息所需的內容,其中包括?志等級、對應的loggername
印?志源?件的位置信息(包括?件名和?號)、線程ID時間戳信息具體的?志信息等內容

定義日志消息類,進行日志中間信息的存儲:1.日志的輸出時間   用于過濾日志輸出時間2.日志等級        用于進行日志過濾分析3.源文件名稱 4.源代碼行號      用于定位出現錯誤的代碼位置5.線程ID          用于過濾出錯的線程6.日志主體消息7.日志器名稱  (當前支持多日志器的同時使用)
*/
#ifndef __M_MESSAGE_H__
#define __M_MESSAGE_H__#include"util.hpp"
#include"level.hpp"
#include<iostream>
#include<string>
#include<thread>namespace xupt
{struct LogMsg{size_t _ctime; //日志產生的時間LogLevel::value _level; //日志等級size_t _line;  //行號std::thread::id _tid; //線程idstd::string _file; //文件名std::string _logger; //日志器名稱std::string _payload; //有效消息處理//對應的構造函數LogMsg(LogLevel::value level,size_t line,std::string file,std::string logger,std::string msg):_ctime(util::Date::now()),_level(level),_line(line),_tid(std::this_thread::get_id()),_file(file),_logger(logger),_payload(msg){}};}#endif

到這本篇博客的內容就到此結束了。
如果覺得本篇博客內容對你有所幫助的話,可以點贊,收藏,順便關注一下!
如果文章內容有錯誤,歡迎在評論區指正

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713471.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713471.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713471.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在 Spring Boot 3.x 中使用 SpringDoc 2 / Swagger V3

SpringDoc V1 只支持到 Spring Boot 2.x springdoc-openapi v1.7.0 is the latest Open Source release supporting Spring Boot 2.x and 1.x. Spring Boot 3.x 要用 SpringDoc 2 / Swagger V3, 并且包名也改成了 springdoc-openapi-starter-webmvc-ui SpringDoc V2 https://s…

select,poll和epoll有什么區別

它們都是NIO中多路復用的三種實現機制&#xff0c;是由linux操作系統提供的。 用戶空間和內核空間&#xff1a;操作系統為了保證系統安全&#xff0c;將內核分為兩個部分&#xff0c;一個是用戶空間&#xff0c;一個是內核空間。用戶空間不能直接訪問底層的硬件設備&#xff0…

IT廉連看——Uniapp——配置文件pages

IT廉連看——Uniapp——配置文件pages [IT廉連看] 本堂課主要為大家介紹pages.json這個配置文件 一、打開官網查看pages.json可以配置哪些屬性。 下面邊寫邊講解 新建一個home頁面理解一下這句話。 以下一些頁面的通用配置 通用設置里我們可以對導航欄和狀態欄進行一些設…

Android修行手冊-集成Python開發環境

Unity3D特效百例案例項目實戰源碼Android-Unity實戰問題匯總游戲腳本-輔助自動化Android控件全解手冊再戰Android系列Scratch編程案例軟考全系列Unity3D學習專欄藍橋系列ChatGPT和AIGC &#x1f449;關于作者 專注于Android/Unity和各種游戲開發技巧&#xff0c;以及各種資源分…

Debezium發布歷史161

原文地址&#xff1a; https://debezium.io/blog/2023/09/13/debezium-2-4-beta2-released/ 歡迎關注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻譯&#xff0c;僅供參考&#xff0c;筆芯筆芯. Debezium 2.4.0.Beta2 Released September 13, 2023 by Chris Cranfo…

Apache Flink連載(三十五):Flink基于Kubernetes部署(5)-Kubernetes 集群搭建-1

?? 個人主頁:IT貧道-CSDN博客 ?? 私聊博主:私聊博主加WX好友,獲取更多資料哦~ ?? 博主個人B棧地址:豹哥教你學編程的個人空間-豹哥教你學編程個人主頁-嗶哩嗶哩視頻 目錄 ?編輯

Python爬蟲——Urllib庫-2

編解碼 問題引入 例如&#xff1a; https://www.baidu.com/s?wd章若楠 https://www.baidu.com/s?wd%E7%AB%A0%E8%8B%A5%E6%A5%A0 第二部分的一串亂碼就是章若楠 如果這里是寫的章若楠就會 產生這樣的錯誤 所以我們就可以使用get請求方式的quote方法了 get請求方式的q…

laravel ApiResponse接口統一響應封裝

一&#xff0c;新增接口返回碼配置文件 在config中新增配置文件apicode.php <?phpreturn [ apicodes>[/*** Message("OK")* 對成功的 GET、PUT、PATCH 或 DELETE 操作進行響應。也可以被用在不創建新資源的 POST 操作上*/HTTP_OK > 200,/*** Message(&qu…

使用el-form之表單校驗自動定位到報錯位置問題,,提升用戶體驗

需求描述 由于需要填寫的表單項太多&#xff0c;提交的時候校驗不通過&#xff0c; 如果沒填寫的表單項在最上面&#xff0c;用戶看不到不知道發生了啥&#xff0c; 所以需要將頁面滾動定位到第一個報錯的表單項位置&#xff0c;提升用戶體驗實現步驟 1. 給form表單添加ref …

數據中心GPU集群高性能組網技術分析

數據中心GPU集群組網技術是指將多個GPU設備連接在一起&#xff0c;形成一個高性能計算的集群系統。通過集群組網技術&#xff0c;可以實現多個GPU設備之間的協同計算&#xff0c;提供更大規模的計算能力&#xff0c;適用于需要大規模并行計算的應用場景。 常用的組網技術&…

1209. 帶分數 刷題筆記

思路 暴力匹配 讀入目標數 n 看n是否與ab/c相等 因為c里面的除法是整除 我們將 nab/c 轉換為 c*na*cb 那么如何獲得a,b&#xff0c;c 依題意 a&#xff0c;b&#xff0c;c三個數由1-9九個數字組成 且每個數字只能出現一次 由此 我們可以搜出123456789的全部排列方式…

我做的app上架應用市場一天,快破400下載量,0差評

上集說到&#xff0c;我做了一個叫QB音樂的安卓app&#xff0c;經過一段時間的自我使用與測試終于算發布了。我昨天順便把它上架了奇妙應用市場&#xff0c;截止目前3月1號過去了一天&#xff0c;下載量快到400&#xff0c;0差評。看來還是能正常使用的。 一、為什么做這個ap…

CleanMyMac X2024免費Mac電腦清理和優化工具

CleanMyMac X是一款專業的 Mac 清理和優化工具&#xff0c;它具備一系列強大的功能&#xff0c;可以幫助用戶輕松管理和維護他們的 Mac 電腦。以下是一些關于 CleanMyMac X 的主要功能和特點&#xff1a; 智能清理&#xff1a;CleanMyMac X 能夠智能識別并清理 Mac 上的無用文件…

深入剖析k8s-Pod篇

為什么需要Pod&#xff1f; 進程是以進程組的方式組織在一起。受限制容器的“單進程模型”&#xff0c; 成組調用沒有被妥善處理&#xff08;資源調用有限&#xff09;&#xff0c;使用資源囤積則導致復雜度上升。 在k8s項目中&#xff0c;Pod的實現需要使用一個中間容器——…

css【詳解】—— 圣杯布局 vs 雙飛翼布局 (含手寫清除浮動 clearfix)

兩者功能效果相同&#xff0c;實現方式不同 效果預覽 兩側寬度固定&#xff0c;中間寬度自適應&#xff08;三欄布局&#xff09;中間部分優先渲染允許三列中的任意一列成為最高列 圣杯布局 通過左右欄填充容器的左右 padding 實現&#xff0c;更多細節詳見注釋。 <!DOCTYP…

《無線網絡技術》考試版筆記

第一章 無線網絡介紹 什么是多徑效應&#xff0c;如何去克服&#xff1a; 在發射機和接收機之間沒有明顯的直線路徑時&#xff0c;就會產生多徑傳播。如果兩個信號彼此疊加&#xff0c;那么接收設備就無法正確解調信號&#xff0c;無法還原為它的原始數據形式。 可以稍微調整接…

【leetcode熱題】求根到葉子節點數字之和

難度&#xff1a; 中等通過率&#xff1a; 40.6%題目鏈接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 題目描述 給定一個二叉樹&#xff0c;它的每個結點都存放一個 0-9 的數字&#xff0c;每條從根到葉子節點的路徑都代表一個數字。 例如&#xff0c;從根到葉子…

Linux包管理dpkg、apt和snap

dpkg、apt和snap都是Ubuntu系統中用于軟件管理的工具&#xff0c;但它們在功能和使用上有一些區別。 dpkg: dpkg是Debian包管理系統的底層工具&#xff0c;也是apt和其他高級包管理工具的基礎。主要功能是用于安裝、卸載、配置和構建Debian軟件包&#xff08;.deb文件&#xff…

vue面試題:Computed 和 Watch 的區別?

Computed 和 Watch 的區別? 對于Computed&#xff1a;對于Watch&#xff1a;immediate&#xff1a;組件加載立即觸發回調函數deep&#xff1a;深度監聽&#xff0c;發現數據內部的變化&#xff0c;在復雜數據類型中使用&#xff0c;例如數組中的對象發生變化。需要注意的是&am…

USLE模型-LS因子的計算

目錄 計算坡度計算填洼計算流向計算水流長度計算水平投影![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/75e015b2d6874ce9b6652f2b8730b90f.png)計算可變的坡度指數m計算坡長因子L計算坡度因子S計算LS因子參考視頻 計算坡度 準備好30米分辨率的dem 計算填洼 計…