2012-03-27 55 views
3

現有ç/C++的日誌方案。原來,Pantheios可能是在我的情況最好的一些調查,這是最低的開銷,如果日誌被禁用。C/C++日誌工具調用取決於日誌級別

所有的記錄器似乎都支持某種打印日誌消息。但是,在我的情況下,我有一個函數調用,應該避免日誌記錄被禁用(因爲它非常昂貴)。

目前,我用一個很簡單的記錄設置像

#ifdef DEBUG_L1  
cout << "msg 1" << endl // log level 1 
#ifdef DEBUG_L2 
printBuffer()   // log level 2 
#endif 
#endif 

,供應我的需要(現在),因爲我付出零開銷,如果日誌被禁用。然而,代碼很快看起來很醜,並且不太靈活。

這應該用C++記錄器來實現。如上所述,printBuffer()的功能體非常昂貴。如果日誌記錄關閉,則可以避免調用它。

是否有可能聲明一個完整的函數調用只在高於某個日誌級別時執行?或者在這種情況下我還需要預處理器嗎?

編輯:

謝謝@BobTFish。我實際上正在考慮使用你所描述的那種設置。我想知道如何靈活地實現這種事情。通常我會記錄一組字符串和值(int,float和指針)。在風格

cout << "name1=" << int << " name2=" << (void*)(ptr) << endl; 

現在,我真的不喜歡在此時切換到printf的語法。宏觀方法如何處理(因爲它只用一個類參數進行模板化)?

+0

請說明是否可以在運行時更改日誌級別(包括從配置文件讀取),而不是編譯爲 – 2016-02-01 03:05:15

回答

1

我認爲你可以使用谷歌日誌庫從here

典型的使用考勤記錄與條件

#include <glog/logging.h> 

{ 
    // Initialize logging. There are multiple options, so read the documentation 
    google::InitGoogleLogging(); 

    void* p; 
    LOG_IF(INFO, p == nullptr) << "We have nullptr. Bomb detected!"; 

    // Don't forget to shut that down 
    google::ShutdownGoogleLogging(); 
} 
0

如果您關心的性能和運行時開銷,看看zf_log庫。你可能喜歡的東西:

  • 它評估日誌參數並僅在必要時調用實際日誌功能(當日志級別允許時)。
  • 它具有運行時日誌級別和編譯時日誌級別。低於編譯時日誌級別的語句編譯出來並且沒有運行時開銷。
  • 運行時日誌級別可以在運行時更改,但是當消息日誌級別低於運行時日誌級別時,參數將不會被評估,並且實際日誌功能將不會被調用。唯一將要評估的是if (msg_log_level >= runtime_log_level)
  • 它具有非常小的呼叫站點(每個LOG()行產生的代碼量),比其他庫小3x-20倍。
  • 它不會減慢包含其標題的源代碼的編譯速度(與某些僅包含標題的庫不同)。
2

我想到的是C++特定的基於模板的日誌框架,如easylogging或spdlog。例如,在spdlog中,您可以通過實現接收器接口來創建自定義日誌目標。另一個(可能更好)選項是使用它的日誌級別功能。

下面一個例子(從spdlog手動複製):

// 
    // Runtime log levels 
    // 
    spd::set_level(spd::level::info); //Set global log level to info 
    console->debug("This message shold not be displayed!"); 
    console->set_level(spd::level::debug); // Set specific logger's log level 
    console->debug("Now it should.."); 

通過實施< <運營商爲自己的自定義類,你可以控制哪些數據被轉儲到日誌中。使用logger->should_log()您可以測試是否啓用指定的日誌級別。