日誌系統採用了單例模式,單例模式保證乙個類只有乙個例項,同時提供了乙個可供全域性訪問該例項的靜態方法,該例項可以被程式的所有模組共享。
實現方法:通過乙個類靜態成員返回區域性靜態例項,可供全域性訪問。同時私有化類的建構函式、析構函式。防止外界建立單例類的物件。
class
logprivate
:log()
;~log();
};
主要包括判斷同步日誌/非同步日誌、初始化日誌類的成員變數(日誌的緩衝區申請記憶體、日誌最大行數、日誌的日期等)、建立日誌檔案(日誌檔名是根據日期命名的)
如果是非同步方式寫入,在初始化時開闢一條日誌執行緒,在該執行緒中向日誌檔案寫入資訊。
1、首先傳入的引數確定日誌的具體型別
目前定義有4種型別,debug,info,warn,errno。
2、獲取寫入日誌的具體時間
3、判斷是否需要新建日誌檔案
日誌系統做到按天分類,或者單個日誌檔案超過最大行數也需要新建日誌檔案。
所以1、當前日期與當前日誌不在同一天時需要新建日誌檔案,
2、或者當天日誌寫入的行數是單個日誌檔案最大行數的倍數時,需要新建日誌檔案
4、格式化日誌資訊
日誌資訊按照規定的格式寫入日誌檔案
年-月-日 時-分-秒.微秒 日誌型別 真正的資訊
2020-06-29 18:01:42.399499 [info]: send data to the client(192.168.43.1)
5、及時重新整理緩衝區
int fflush(file *stream)
每次向日誌檔案寫入資訊時,都可以呼叫該函式,及時的重新整理讀寫緩衝區。
實際上呼叫printf()等時都是先將資料寫到緩衝區當中,當遇到\n等換行符號時才會重新整理緩衝區寫入到具體的流stream中。如果上一次寫入的資訊還在緩衝區中,下一次又寫入到緩衝區的資料可能會覆蓋上一次的資料,造成錯誤。fflush()方法可以及時的重新整理緩衝區。
例子:
#include
#include
#include
intmain()
return0;
}
0123456789會一次性列印出來,而不是乙個個的列印,說明確實是先輸出到緩衝區當中了。
1、生產者消費者模型
該非同步日誌系統使用了經典的生產者消費者併發模型,生產者消費者共享了乙個佇列。
伺服器的主線程和各個工作執行緒向該佇列寫入具體的資訊,是為生產者;
單獨開闢的一條執行緒會從佇列中取出資訊,寫入到日誌檔案中。是為消費者。
1、及時重新整理緩衝區
void
* log::
async_write_log()
}
2、避免死鎖
日誌類中多次用到互斥鎖,容易出現在乙個執行緒中對乙個已經加鎖的互斥鎖再次加鎖,出現死鎖,此時會一直阻塞下去。
搭建http伺服器
本節以中標麒麟桌面作業系統 龍芯版 為例,簡單介紹 http伺服器搭建方法,其他作業系統或搭建 ftp 伺服器,請參考相關使用者手冊或網路資料。1.在 var www html 下建立update,再在update下建立packages 和repodata。將軟體包拷貝到 var www html ...
搭理http伺服器
由於在某些特定場景下,我們的外網訪問會受到限制,如果有一些訪問需求的話就需要乙個 作為中轉了。首先需要一台機器作為中轉的伺服器,這時候當然要去阿里雲買一台啦微笑。作業系統一定要選linux,我使用的是centos。之後的主要目標是在這台機器上搭建乙個http 了。當然肯定不可能自己從頭開始寫,用現有...
檢視伺服器日誌
我們很樂意的借助於cnzz,51la等做 的統計,以獲得 執行一手資料的獲得。那伺服器日誌能做什麼呢?舉乙個例子。倘若一些被使用到某大流量 本來就不寬裕的 流量 經得起這樣的折騰啊!從原始日誌這裡就能找到流量大量流失的原因。但凡 出現異常,檢視 日誌總能找到蛛絲馬跡,因為伺服器日誌會自動記錄你的 網...