記錄器存在的問題之一是,即使您不希望它們記錄,它們也會記錄。他們通常是硬連線寫入文件或迴應控制檯 - 有時兩者。 這與單元測試相反,其中記錄到任一接收器會降低測試速度。重載函數運算符
我也反對使用printf樣式可變參數,因爲它們總是會因爲人員剪切,粘貼和忘記更改參數類型或從字符串中刪除參數而錯誤。
所以我決定做點什麼。
我的基本想法是將LogStream對象接受ostream
作爲參數,以便您可以指定文件,控制檯或在單元測試期間靜默吞下它。這通過 作爲Logger類的參數,該類也接受嚴重性級別。
這是一個記錄器,僅記錄致命事件的ostringstream(從單元測試意譯)的概念流程:
std::ostringstream oss;
auto logstream = LogStream(oss);
auto logger = Logger(logstream, FATAL);
logger(INFO) << "This is a log test\n"; // (1)
std::cout << oss.str(); // Display nothing as nothing fatal has been logged
有關問題的思考,我需要一個臨時的流(ostream的將工作)在決定它是否滿足放置在LogStream對象中的條件之前保存流。
我遇到的問題是線(1)您將有函數調用操作符,它返回參考LogStream已和它退出後流的其餘部分構成:
LogStream& operator()(Severity severity)
{
// stream not completed
return *m_dest;
}
我覺得有一種方法,因爲你可以得到重載插入運算符友元函數,其使用的是流參數:
std::ostream& operator<<(std::ostream& os, const Complex& c)
{
os << c.real << '.' << c.imaginary;
return os;
}
但作爲然而,我一直無法弄清楚的功能操作的正確語法。
有可能,還是我吠叫錯了樹?
改造車輪很少會獲得獎勵。不缺乏滿足您要求的測井設施。 Boost.Log和Log4cpp等等。 – SergeyA
通常我會同意,但是在比您的項目大幾個數量級的庫中,看起來有點OTT(並且我知道只有標題被拉入或者您只是鏈接一個靜態庫)。 –
函數運算符的語法是正確的(作爲成員函數)。你有什麼問題? – ecatmur