假設我們有幾個級別的日誌記錄:trace,debug,info,error。 我想知道是否有寫下面的代碼的方式:C++中的懶惰日誌記錄
enum log_level = {trace, debug, info, error};
log_level global_log_level = info;
void log(log_level level, string& message){
if (level >= global_log_level){
std::cout << message << std::endl;
}
}
string create_message(){
...
}
log_level level = debug;
log (level, create_message());
沒有create_message被稱爲如果級別爲越小global_severity_level。事實上,create_message可能會很長,並且不管它創建了什麼字符串。如果有很多「調試」日誌,那麼在非調試模式下運行時,這些日誌可能會產生大量開銷。
我知道如果函數「log」是一個宏,可以這樣做,只有在severity> minimal_severity;時才調用create_message()。但沒有另外一種方法可以在沒有宏的情況下執行此操作?
編輯
在上面,我沒有指定create_message,因爲它可以是任何東西,特別是:
log(level, "Created object " + my_object.getName());
在這種情況下,有沒有寫日誌這樣的方式沒有創建完整的字符串,以相對透明的方式爲程序員調用日誌?
非常感謝
你可以'create_message()'檢查'global_log_level'。 – NPE
您可以將'create_message'函數傳遞給'log()',所以'log()'只會在級別合適的情況下生成昂貴的消息? – JaredC
你好,我指的是一個未指定的函數create_message(),因爲這個消息可能來自任何地方,但它可以在運行時寫入,就像log(level,「Object」+ my_object.getName()+「已被創建」)。 ; - 在這種情況下,我無法將任何內容傳遞給create_message(),它基本上是2個字符串之間的運算符+。我也不能將此函數作爲函數傳遞到日誌中... – GHL