2012-07-09 82 views
0

我正在編寫程序時突然出現瘋狂的想法:什麼是在我的程序中創建日誌系統的最佳方式?我的意思是我如何將日誌保存在我的代碼中的任何地方(當然不包括頭文件)?喜歡的東西如何在我的程序中創建日誌記錄系統?

myLogs << "Ups, somthing failed :("; 

你知道,前面我剛打開文件並保存什麼,我想,但現在我想這樣做在一個親方式:DI還想着類將被所有其他類繼承,但這是有問題的。我也想過靜態函數,但我不確定它是如何工作的。

+0

與[此問題]相關的問題(http://stackoverflow.com/questions/696321/best-logging-framework-for-native-c) – 2012-07-09 10:07:51

回答

2

沒有一個簡單的答案;這取決於應用程序。我有 在一些非常大的項目上工作,您可以在不同子系統上配置日誌 的不同方式;這樣的一個系統會在 中過小一點的應用程序。如果應用程序 必須長時間保持不變,這也是有區別的;在這種情況下,您需要 一些條款來重新配置日誌而不停止 應用程序。

更多或更少的一般,但是,你會想要一個日誌配置文件, 指定不同級別的日誌記錄,以及如何處理日誌 消息做。您還需要確保在沒有日誌記錄時執行最少的操作 。我使用的一種解決方案是爲每個可用操作(寫入文件,發送電子郵件, 或發送到系統日誌)維護各種 流緩衝。然後,我將有一個ostream *表,由 日誌級別索引;如果該級別有任何日誌記錄,我將創建一個 streambuf,它將轉發所有必要的操作streambufs,並且 將在其中使用它的ostream的地址放入表中。這些特殊的 streambuf還具有啓動和停止每個日誌記錄的功能: 開始記錄的那個將以文件名和行號調用, ,停止記錄的將刷新每個管理的流。 如果給定級別上沒有日誌記錄,則ostream指針爲空。

基本的記錄則是:

class Logger 
{ 
    std::ostream* myDest; 
    int* myUseCount; 
public: 
    Logger(int level, char const* filename, int lineNumber) 
     : myDest(ourLogTable[level]) 
     , myUseCount(new int(1)) 
    { 
     if (myDest != NULL) { 
      myDest->rdbuf()->startLogRecord(filename, lineNumber); 
     } 
    } 

    Logger(Logger const& other) 
     : myDest(other.myDest) 
     , myUseCount(other.myUseCount) 
    { 
     ++ *myUseCount; 
    } 

    ~Logger() 
    { 
     -- *myUseCount; 
     if (*myUseCount == 0 && myDest != NULL) { 
      myDest->flush(); 
     } 
    } 

    template <typename T> 
    Logger& operator<<(T const& obj) 
    { 
     if (myDest != NULL) { 
      *myDest << obj; 
     } 
    } 
}; 

(。隨着C++ 11,你應該使用移動語義,而不是我的參考 計數簡單多了)

最後,您調用記錄器通過宏:

#define LOG(level) Logger(level, __FILE__, __LINE__) 

,如果你想自動插入 文件名和行號的使用宏是必要的。

1

創建一個類,並重載operator<<來實現寫入文件或任何你想要的。

#include <fstream> 
#include <iostream> 

using namespace std; 

class logger 
{ 
public: 
    void operator<<(const std::string & input); 
}MyLogger; 

void logger::operator <<(const string &input) 
{ 
    std::ofstream of("filename.txt"); 
    of << input; 
    of.close(); 
} 

int main() 
{ 
    MyLogger<<"sometext"; 
} 
+0

'MyLogger <<「Error」<< XXX <<「Out奶酪錯誤。從開始重做。「;' – 2012-07-09 14:22:15

0

不知道如果我理解這個問題完全是,但我所做的是日誌數據發送到另一個應用程序,使用WM_SETTEXT消息(然後又自定義消息提交數據) - 你還需要編寫一個基本的監聽器應用程序,它將讀取和存儲數據,最好是像列表框這樣的控件。這非常快,因爲它不涉及文件系統,管道,套接字等。您還可以在頭文件中使用條件編譯(由#define/#ifdef指令控制)來打開或關閉日誌記錄。