glog 實踐心得

2021-09-03 08:49:32 字數 1348 閱讀 2826

標記選項

關於minloglevel

它的運用一般在於除錯debug,當我們的專案處於debug時,可以列印很多除錯log,把log級別定位為 info級別,當除錯好後把minloglevel設定高於 info 級別後,程式關於除錯的log就不會被列印出來了,這樣十分便利。

雖然低於minloglevel級別的log不會列印出來,但是它們的相應級別檔案也會被建立出來,並且低階別的日誌檔案也會包含高階log的資訊,比如waning的日誌檔案就會包含waning及其以上級別的log。

初始化&善後

glog 如何實現執行緒安全

我們知道iostream 是執行緒安全的,但是使用iostream很難實現執行緒安全,比如:

std::cerr << "hello" << "world";
其實都是呼叫了operator << 函式,雖然單個 operator << 是執行緒安全的,但是連著就不一定了,在多執行緒環境下可能因為排程的原因,就會出現日誌錯行執行緒不安全的事件。

#define log(severity) compact_google_log_ ## severity.stream()

#define compact_google_log_warning google::logmessage( __file__, __line__, google::glog_warning)

#define compact_google_log_info google::logmessage(__file__, __line__)

glog 使用以上方式實現執行緒安全,每次log(info)之類的日誌輸出,都會生成乙個臨時物件,因為這個物件是在棧上生成所以該物件是執行緒安全的。生成logmessage 這個物件後,它的成員stream()函式會返回相應乙個物件,這個物件繼承了 ostream,所以就實現了 通過《實現日誌輸出。

繼續stream(),stream接受完使用者的輸入後儲存到其內部,然後logmessage臨時物件生命週期到期,進行析構,析構了呼叫了flush進行資料落地。

資料落地這裡,首先glog 會構造不同級別的幾個用於日誌落地的全域性物件。不同的log級別獲取不同 日誌落地的物件進行落地,如果是info級別就不會立即落地,而是快取到這個靜態物件的緩衝區中。

邏輯流

flush-> 獲取全域性用於落地的物件 logdestination -> logtoalllogfiles -> write 落地
訪問全域性物件的時候加了鎖,所以glog多執行緒下訪問全域性鎖效能不是很高。

flush 中會對minloglevel做判斷,也就是即使當前日誌級別低於minloglevel,它前面的構造這些開銷也是需要的只是不會競爭鎖進行資料落地。

GTD實踐心得

大概2月份的時候,開始看gtd 儘管去做 無壓工作的藝術 斷斷續續看了2個月左右,期間多了很多做事的感悟。總結gtd這本書,主要有兩個感悟。第一,通過使用文具來制定行動列表。我認為對於乙個學生來說,某些建議不是那麼實用,根據實際情況做了一些修改。我實踐這一部分的內容,是從購置資料夾開始的。資料夾的作...

mysql實踐周心得 實踐周心得體會

實踐周心得體會 心得一 本週是教學的實踐周。在集中聽了幾位老師的課,加上自己開課後,簡單的談一下自己對微課程的心得體會。心得二 這次的人任務是拍片,分別要求是乙個新聞片乙個專題片。我們組只有5個人,分別是,高x 馮xx 陳xx 金x 和我,可以說人盡其用。我們很早就討論策劃方案,並在網上啟動了多人聊...

Glog 使用簡介

編譯 cmake編譯需要使用3.0以上版本,編譯成功之後會生成libglog.a庫,使用的時候包含標頭檔案 include就可以了 使用簡介 glog通過google initgooglelogging flkcdp 進行初始化。glog生成的日誌檔名稱類似於下面 flkcdp.ubuntu.roo...