【日志信息管理】管理日志信息的類

?日志用于記錄程序的執行記錄包括程序的出錯記錄,程序致命退出原因,程序的正常執行記錄。這樣我們就可以很快的察覺程序的錯誤原因、執行狀況等等,因此管理日志信息是非常重要的。

日志一般由以下部分組合:

日志時間、日志等級、日志內容、日志文件的名稱

日志等級分為5個:Info:常規信息、Warning:報警信息、Error:發生錯誤,需要立即處理、Fatal:致命信息、Debug:調試信息

學習一下多參數函數相關的c接口:

#include <iostream>
#include <stdarg.h>
int argfunc(int n, ...)//n是要相加的元素個數,...代表要傳入的參數
{va_list s;//s相當于一個int*類型的指針va_start(s, n);//s=&n+1int sum=0;while(n--){sum += va_arg(s, int);}va_end(s);//將s置為空return sum;
}
int main()
{int a= argfunc(3,1,2,3);std::cout<<a<<std::endl;return 0;
}

?vsnprintf函數

利用多參數相關接口,就可以實現對函數進行動態參數傳參!

time函數

localtime函數

localtime函數的返回值是一個struct tm結構體類型的指針,struct tm結構體里儲存了對應時間戳的年月日時分秒,如下就是struct tm結構體:

具體代碼實現如下:

log.hpp

#pragma once
#include <iostream>
#include <string>
#include <ctime>
#include <cstdio>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <unistd.h>#define Screen 1    // 表示向顯示器上打印日志信息
#define Onefile 2   // 表示向logtxt日志文件里寫日志信息(沒有該日志文件open函數會自動創建)
#define Classfile 3 // 對向指定等級的日志文件寫內容,比如:Fatal等級的日志信息寫到logtxt.Fatal日志文件中#define Size 1024
#define Logfile "log.txt"class Log
{
public:Log(int n = 1): printmethod(n), path("./log/"){}void printLogtxt(const std::string &s, const char *logtxt){switch (printmethod){case Screen:std::cout << logtxt;break;case Onefile:printOneFile(Logfile, logtxt);break;case Classfile:printClassFile(s, logtxt);break;default:break;}}void printOneFile(const std::string &Logname, const std::string& logtxt){std::string _s = path + Logname; // 給logtxt文件加上我們路徑,方便我們以后再該路徑里管理日志文件int fd = open(_s.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0666);if (fd < 0){perror("open");return;}write(fd, logtxt.c_str(), logtxt.size());close(fd);}void printClassFile(const std::string &s, const char *logtxt){std::string _s(Logfile);_s+= ".";_s+= s;printOneFile(_s, logtxt);}void operator()(const std::string &str, const char *format, ...){time_t t = time(nullptr);struct tm *ctime = localtime(&t);char str1[Size] = {0};snprintf(str1, sizeof(str1), "[%s][%d-%d-%d:%d:%d:%d]", str.c_str(), ctime->tm_year + 1900,ctime->tm_mon + 1, ctime->tm_mday,ctime->tm_hour, ctime->tm_min, ctime->tm_sec);va_list s;va_start(s, format);char str2[Size] = {0};vsnprintf(str2, sizeof(str2), format, s); // format是格式字符串  s是多參數...的第一個字符串地址va_end(s);char logtxt[2 * Size] = {0};snprintf(logtxt, sizeof(logtxt), "%s %s\n", str1, str2);printLogtxt(str, logtxt);}private:int printmethod;std::string path; // 日志文件將來被創建時所在的路徑,更有利于我們管理日志文件
};

testlog.cpp

#include "log.hpp"
#include <errno.h>
#include <cstring>
#include <vector>
int main()
{Log log(3);log("Info", "向%s日志文件里寫入內容成功!", "log.txt.Info");std::vector<int> v = {1,2};if(!v.empty())log("Debug", "v.size() is %d", v.size());return 0;
}

在log目錄下生成的log.txt.Info文件:

在log目錄下生成的log.txt.Debug文件:

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

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

相關文章

Java 基礎--File - IO流(2)

I/O流 定義 數據從硬盤流向內存為輸入流&#xff0c;數據從內存流向硬盤為輸出流。輸入也叫讀取數據&#xff0c;輸出也叫寫出數據。 IO分類 1.按照數據的流向分為&#xff1a;輸入流和輸出流 ①輸入流&#xff1a;把數據從其他設備上讀取到內存中的流 ②輸出流&#xff1…

Qt 基礎組件速學 事件過濾器

學習目標&#xff1a;理解事件過濾器 前置環境 運行環境:qt creator 4.12 學習內容和效果演示&#xff1a; Qt 提供了事件過濾器的機制,允許我們在事件到達目標對象之前對事件進行攔截和處理。這在以下情況下非常有用: 全局事件處理: 我們可以在應用程序級別安裝一個事件過…

工控人最愛的PLC觸摸屏一體機,有多香

PLC觸摸屏一體機是什么 PLC觸摸屏一體機&#xff0c;聽起來可能有點技術化&#xff0c;但簡單來說&#xff0c;它就是一個集成了可編程邏輯控制器&#xff08;PLC&#xff09;和觸摸屏的智能設備。這種設備不僅能夠執行自動化控制任務&#xff0c;還能實時顯示和操作設備狀態&a…

JVM原理(十九):JVM虛擬機內存模型

1. 硬件的效率與一致性 數據不安全的原因&#xff1a;緩存一致性的問題 共享內存多核系統&#xff1a;在多路處理器系統中&#xff0c;每個處理器都有自己的高速緩存&#xff0c;而他們又共享同一主內存。 線程先后執行結果不一致問題&#xff1a;除了增加高速緩存之外&#…

【Python】已解決:nltk.download(‘stopwords‘) 報錯問題

文章目錄 一、分析問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例五、注意事項 已解決&#xff1a;nltk.download(‘stopwords’) 報錯問題 一、分析問題背景 在使用Python的自然語言處理庫NLTK&#xff08;Natural Language Toolkit&#xff09;時&#xff0c…

后端開發常見錯誤

1、解析json字符串要考慮格式不正確&#xff0c;空值情況 2、解析時間字符串要考虎格式和空值 3、使用mybatis的foreach的時候要考慮拼接sql的耗時&#xff0c;尤其是超過10條數據 4、表字段長度&#xff0c;在接口層校驗字段長度&#xff0c; 調用三方系統的報錯要截取報錯…

CentOS 7安裝Elasticsearch7.7.0和Kibana

一. 準備安裝包 elasticsearch和kibana&#xff1a;官網歷史版本找到并下載&#xff08;https://www.elastic.co/cn/downloads/past-releases#elasticsearch&#xff09;ik分詞器&#xff1a;GitHub下載&#xff08;https://github.com/infinilabs/analysis-ik/releases/tag/v…

【大模型】衡量巨獸:解讀評估LLM性能的關鍵技術指標

衡量巨獸&#xff1a;解讀評估LLM性能的關鍵技術指標 引言一、困惑度&#xff1a;語言模型的試金石1.1 定義與原理1.2 計算公式1.3 應用與意義 二、BLEU 分數&#xff1a;翻譯質量的標尺2.1 定義與原理2.2 計算方法2.3 應用與意義 三、其他評估指標&#xff1a;綜合考量下的多元…

設計模式之狀態機模式

一、狀態機模式介紹 狀態機模式&#xff08;State Machine Pattern&#xff09;是一種用于描述對象行為的軟件設計模式&#xff0c;屬于行為型設計模式。在狀態機模式中&#xff0c;對象的行為取決于其內部狀態&#xff0c;并且在不同的狀態下&#xff0c;對象可能會有不同的行…

STM32F103C8T6核心板原理圖和PCB分享

PCB圖 原理圖 資料下載地址&#xff1a; 原理圖PCB庫: https://545c.com/d/45573183-61875742-29897c?p7526 (訪問密碼: 7526)

[go-zero] 簡單微服務調用

文章目錄 1.注意事項2.服務劃分及創建2.1 用戶微服務2.2 訂單微服務 3.啟動服務3.1 etcd 服務啟動3.2 微服務啟動3.3 測試訪問 1.注意事項 go-zero微服務的注冊中心默認使用的是Etcd。 本小節將以一個訂單服務調用用戶服務來簡單演示一下&#xff0c;其實訂單服務是api服務&a…

Java 使用sql查詢mongodb

在現代應用開發中&#xff0c;關系型數據庫和NoSQL數據庫各有千秋。MongoDB作為一種流行的NoSQL數據庫&#xff0c;以其靈活的文檔模型和強大的擴展能力&#xff0c;受到廣泛歡迎。然而&#xff0c;有時開發者可能更熟悉SQL查詢語法&#xff0c;或者需要在現有系統中復用SQL查詢…

【ARMv8/v9 GIC 系列 5.6 -- GIC 超優先級中斷詳細介紹】

請閱讀【ARM GICv3/v4 實戰學習 】 文章目錄 Interrupt superpriority超優先級中斷的特性和應用Physical interface interrupt signalsPhysical Group 1 Non-NMI for Current Security StatePhysical Group 1 for Other Security State, or a Group 0 Non-NMIPhysical Group 1 …

進程控制-wait和waitpid進程回收

wait 阻塞函數 函數作用&#xff1a; 1. 阻塞并等待子進程退出 2. 回收子進程殘留資源 3. 獲取子進程結束狀態&#xff08;退出原因&#xff09; pid_t wait(int *wstatus); 返回值&#xff1a; ‐1 : 回收失敗&#xff0c;已經沒有子進程了 >0 : 回收子進程對應的…

一種非凸全變差正則化的信號降噪方法(以模擬信號和軸承振動信號為例,MATLAB)

以旋轉機械振動信號為例&#xff0c;由于旋轉機械運行中背景噪聲較強&#xff0c;振動信號需要進行降噪處理。常用的小波閾值降噪會在信號的不連續處產生虛假的波峰和偽吉布森震蕩&#xff0c;而奇異值分解SVD去噪容易產生虛假分量&#xff0c;全變差去噪則不會出現這樣的情況&…

美國大選特色

美國總統是間接民選的。選民不直接投票選舉總統&#xff0c;而是通過選舉一個稱為選舉人團&#xff08;Electoral College&#xff09;的機構成員來間接決定總統。具體過程如下&#xff1a; 1. **選民投票**&#xff1a;在11月的大選日&#xff0c;選民投票選舉他們所在州的選…

深入理解JS逆向代理與環境監測

博客文章&#xff1a;深入理解JS逆向代理與環境監測 1. 引言 首先要明確JavaScript&#xff08;JS&#xff09;在真實網頁瀏覽器環境和Node.js環境中有很多使用特性的區別。尤其是在環境監測和對象原型鏈的檢測方面。本文將探討如何使用JS的代理&#xff08;Proxy&#xff09…

MySQL之備份與恢復(九)

備份與恢復 從備份中恢復 更高級的恢復技術 復制和基于時間點的恢復使用的是相同的技術:服務器的二進制日志。這意味著復制在恢復時會是個非常有幫助的工具&#xff0c;哪怕方式不是很明顯。下面將演示一些可以用到的方法。這里列出來的不是一個完整的列表&#xff0c;但應該…

STM32-USART

本內容基于江協科技STM32視頻學習之后整理而得。 文章目錄 1. 串口通信協議1.1 通信接口1.2 串口通信1.3 硬件電路1.4 電平標準1.5 串口參數及時序1.6 串口時序 2. USART串口通信2.1 USART簡介2.2 USART框圖2.3 USART基本結構2.4 數據幀2.5 數據幀-配置停止位2.6 起始位偵測2.…

DP學習——簡單工廠模式

學而時習之&#xff0c;溫故而知新。 敵人出招&#xff08;使用場景&#xff09; 不同的業務場景下要創建不同的對象&#xff0c;但是這些對象又有共同的特點。如何復用代碼呢&#xff1f;你會想到&#xff0c;這些對象可以抽象出一個基類/抽象類就行了&#xff0c;那么隨著業…