我正在編寫程序時突然出現瘋狂的想法:什麼是在我的程序中創建日誌系統的最佳方式?我的意思是我如何將日誌保存在我的代碼中的任何地方(當然不包括頭文件)?喜歡的東西如何在我的程序中創建日誌記錄系統?
myLogs << "Ups, somthing failed :(";
你知道,前面我剛打開文件並保存什麼,我想,但現在我想這樣做在一個親方式:DI還想着類將被所有其他類繼承,但這是有問題的。我也想過靜態函數,但我不確定它是如何工作的。
我正在編寫程序時突然出現瘋狂的想法:什麼是在我的程序中創建日誌系統的最佳方式?我的意思是我如何將日誌保存在我的代碼中的任何地方(當然不包括頭文件)?喜歡的東西如何在我的程序中創建日誌記錄系統?
myLogs << "Ups, somthing failed :(";
你知道,前面我剛打開文件並保存什麼,我想,但現在我想這樣做在一個親方式:DI還想着類將被所有其他類繼承,但這是有問題的。我也想過靜態函數,但我不確定它是如何工作的。
沒有一個簡單的答案;這取決於應用程序。我有 在一些非常大的項目上工作,您可以在不同子系統上配置日誌 的不同方式;這樣的一個系統會在 中過小一點的應用程序。如果應用程序 必須長時間保持不變,這也是有區別的;在這種情況下,您需要 一些條款來重新配置日誌而不停止 應用程序。
更多或更少的一般,但是,你會想要一個日誌配置文件, 指定不同級別的日誌記錄,以及如何處理日誌 消息做。您還需要確保在沒有日誌記錄時執行最少的操作 。我使用的一種解決方案是爲每個可用操作(寫入文件,發送電子郵件, 或發送到系統日誌)維護各種 流緩衝。然後,我將有一個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__)
,如果你想自動插入 文件名和行號的使用宏是必要的。
創建一個類,並重載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";
}
'MyLogger <<「Error」<< XXX <<「Out奶酪錯誤。從開始重做。「;' – 2012-07-09 14:22:15
不知道如果我理解這個問題完全是,但我所做的是日誌數據發送到另一個應用程序,使用WM_SETTEXT消息(然後又自定義消息提交數據) - 你還需要編寫一個基本的監聽器應用程序,它將讀取和存儲數據,最好是像列表框這樣的控件。這非常快,因爲它不涉及文件系統,管道,套接字等。您還可以在頭文件中使用條件編譯(由#define/#ifdef指令控制)來打開或關閉日誌記錄。
與[此問題]相關的問題(http://stackoverflow.com/questions/696321/best-logging-framework-for-native-c) – 2012-07-09 10:07:51