C 如何寫乙個簡單Logger

時間 2021-05-08 01:23:52

1樓:dc lin

可以去:

看看,裡面的logging庫不少。

2樓:

Logger本身不能阻塞程式的執行,至少不能有較為明顯的阻塞,因此非常適合非同步模型

Logger本身適合流式處理,連續寫不考慮隨機修改之類的問題

日誌內容一旦生成就應該脫離Caller管理,因此Caller不應該負責物件的銷毀,適用移動賦值/unique_ptr。

聯合上述三個特點,Logger本身適合使用的資料模型是非同步佇列:呼叫者將日誌準備好,並且以移動的方式交給Logger,Logger負責持續寫入

class

Logger

}用於日誌的AsyncQueue應該由樂觀鎖進行約束:因為我們只有push和pop操作,不會修改物件內容,也不需要考慮髒讀一類的問題,因此不應該使用悲觀鎖。同時Logger應該盡可能小的占用資源,因此不應該使用自旋鎖。

class

AsyncQueue

unique_ptr

pop()

}這樣對於Logger,可以持續的讀取佇列中的資料並且寫入檔案,同時通過unique_ptr管理記憶體確保持有。

可能唯一需要考慮的就是當主程序收到sigint甚至sigkill之後,如果logger程序還沒有完全寫完要怎麼做。

3樓:yoodaa

首先必須滿足多執行緒安全。

剩下的就簡單了,乙個介面,log.out, 滿足輸出到螢幕和檔案,這就行了。

不滿意的話就往上加工能,比如日誌等級,格式化,顏色,檔案滾增,輸出介面卡,模組別名,還要啥往上懟,無非就是給log.out加引數。

4樓:不可不戒大師

推薦用glog ,開源,好用,速度將就,多執行緒相容. glog有個問題就是format的頭是死的,我反正fork了自己加了log header.

Boost log效率無限低,到最後做benchmark 你會發現就是它最慢。

Log4cpp也不錯

5樓:歐文韜

我寫的簡單log模組,預設實現標準輸出和標準錯誤輸出和滾動檔案輸出後端,支援自定義後端,執行緒安全。

atframework/atframe_utils

atframework/atframe_utils

6樓:

1.開乙個單獨的寫檔案執行緒,用條件變數等待日誌,這樣既能防止多執行緒衝突,又能防止io卡時間。注意執行緒安全退出。

2.沒了,其餘都是工程性問題

7樓:饒萌

可以看看這篇文章,其實是把陳碩的moduo中的多執行緒Logger做了簡化和優化,最終達到了前端100納秒左右的延時,還能支援多程序日誌。

8樓:wez

Spdlog不錯,可以寫到colorconsole, rotating file, daily file,還可以自定義output sink。

效能也相當好。

9樓:Cyandev

首先不清楚題主的具體需求是什麼,我認為 logger 至少需要具備這樣幾個特性:

2. 豐富的格式化支援,能夠很方便地將日誌與時間、pid、當前方法(或檔案)通過佔位符的方式組合起來。

3. 支援多種 severity,可根據執行環境動態啟用與關閉相應的 logger。

4. 如果對效能有要求,尤其是存在寫檔案這樣 I/O 操作的 logger,需要考慮採用多執行緒實現,並做好背壓策略。

以上幾點是乙個 logger 模組必備的特性,實現起來也比較容易,就是看你是不是要寫得 C++ 一些了。比如合理使用運算子過載,用起來像 std::ostream 一樣,這樣模組對外的介面就會比較友好。

10樓:補佳林

專案最先用的log4cpp,發現自己日誌需求就那麼幾項後來用的自己簡單寫的

如果需要用日誌檔案來除錯排錯,則只能加鎖同步寫的方式,不能開個執行緒寫日誌

如果日誌檔案可能多個程序同時寫,則還需要跨程序鎖,防止多個程序互相干擾(可能不加鎖也可以)

寫檔案的話不要寫一條flush一次的話,效能應該影響不大。

11樓:王旭競

你確定是要你寫乙個,而不是針對專案封裝乙個log庫用嗎?

boost.log這個特別適合除錯。正常用比較慢,不建議。

spdlog適合日常業務列印日誌用。舊版非常接近boost.log的操作方式,現在版本類似printf。

學習的話,更推薦nanolog的cpp版本,你去github上搜一下。這個版本效能更好,使用方式也類似boost.log,但是功能少。

12樓:fe263

直接mutex追加模式寫檔案了事....要效能高點的話,mutex守護乙個std::vector,log往裡面塞,然後專門有個執行緒每隔段時間用個區域性vector swap它(當然要先mutex)後把區域性vector的資訊追加到檔案

如何寫乙個這樣的C 程式?

wythe colin 判斷是否是乙個數字,在C 中個人喜歡用正規表示式,比轉換後再判斷的效能要高.public static bool IsNumeric this string value 放在乙個靜態類中,即可直接呼叫判斷.如果想讓使用者在輸入的時候就限制只能輸入實數,則可以定義文字框事件,輸...

如何寫乙個C程式,要求裡面不帶 include

其實 include 只是進行了各種宣告。此示例程式用來計算使用者傳引數的和,根據 取得程式返回值。不過返回值的有效區間為 0 255. Comzyh 用預處理器。g A.cpp E o B.cpp 不管你A.cpp 裡有多少 Include B裡面肯定是沒有了 hellocode include只...

如何寫乙個linux 命令?

優秀 方式很多,可以使用shell寫乙個命令,也可以使用c語言,go語言等寫乙個命令。如下我給出兩個示例 乙個用shell,乙個用c語言。不想要字尾,命令檔案就不要加字尾。在 usr local bin 下新增乙個檔案 custom command c.c。當前也可以使用環境變數的方式,來配置使用此...