freecplus是一個Linux系統下的C/C++開源框架,源代碼請前往C語言技術網(www.freecplus.net)下載。數據庫
本文介紹的是freecplus框架中日誌文件操做的方法。框架
函數和類的聲明文件是freecplus/_freecplus.h。運維
函數和類的定義文件是freecplus/_freecplus.cpp。ide
示例程序位於freecplus/demo目錄中。函數
編譯規則文件是freecplus/demo/makefile。操作系統
對於C/C++服務程序來講,程序運行在後臺,沒有操做界面,無人值守,程序運行的狀態、數據處理的日誌、程序的異常等必須記錄在日誌文件中,運維人員根據日誌文件的內容,查看程序運行和數據處理的狀況。.net
CLogFile類用於服務程序記錄程序的運行日誌。3d
// 日誌文件操做類 class CLogFile { public: FILE *m_tracefp; // 日誌文件指針。 char m_filename[301]; // 日誌文件名,建議採用絕對路徑。 char m_openmode[11]; // 日誌文件的打開方式,通常採用"a+"。 bool m_bEnBuffer; // 寫入日誌時,是否啓用操做系統的緩衝機制,缺省不啓用。 long m_MaxLogSize; // 最大日誌文件的大小,單位M,缺省100M。 bool m_bBackup; // 是否自動切換,日誌文件大小超過m_MaxLogSize將自動切換,缺省啓用。 // MaxLogSize:最大日誌文件的大小,單位M,缺省100M,最小爲10M。 CLogFile(const long MaxLogSize=100); // 打開日誌文件。 // filename:日誌文件名,建議採用絕對路徑,若是文件名中的目錄不存在,就先建立目錄。 // openmode:日誌文件的打開方式,與fopen庫函數打開文件的方式相同,缺省值是"a+"。 // bBackup:是否自動切換,true-切換,false-不切換,在多進程的服務程序中,若是多個進行共用一個日誌文件,bBackup必須爲false。 // bEnBuffer:是否啓用文件緩衝機制,true-啓用,false-不啓用,若是啓用緩衝區,那麼寫進日誌文件中的內容不會當即寫入文件,缺省是不啓用。 bool Open(const char *filename,const char *openmode=0,bool bBackup=true,bool bEnBuffer=false); // 若是日誌文件大於100M,就把當前的日誌文件備份成歷史日誌文件,切換成功後清空當前日誌文件的內容。 // 備份後的文件會在日誌文件名後加上日期時間。 // 注意,在多進程的程序中,日誌文件不可切換,多線的程序中,日誌文件能夠切換。 bool BackupLogFile(); // 把內容寫入日誌文件,fmt是可變參數,使用方法與printf庫函數相同。 // Write方法會寫入當前的時間,WriteEx方法不寫時間。 bool Write(const char *fmt,...); bool WriteEx(const char *fmt,...); // 關閉日誌文件 void Close(); ~CLogFile(); // 析構函數會調用Close方法。 };
示例(demo42.cpp)指針
/* * 程序名:demo42.cpp,此程序演示採用freecplus框架的CLogFile類記錄程序的運行日誌。 * 本程序修改demo40.cpp把輸出的printf語句改成寫日誌文件。 * 做者:C語言技術網(www.freecplus.net) 日期:20190525 */ #include "../_freecplus.h" int main() { CLogFile logfile; // 打開日誌文件,若是"/tmp/log"不存在,就建立它,可是要確保當前用戶具有建立目錄的權限。 if (logfile.Open("/tmp/log/demo42.log")==false) { printf("logfile.Open(/tmp/log/demo42.log) failed.\n"); return -1; } logfile.Write("demo42程序開始運行。\n"); CDir Dir; // 掃描/tmp/data目錄下文件名匹配"surfdata_*.xml"的文件。 if (Dir.OpenDir("/tmp/data","surfdata_*.xml")==false) { logfile.Write("Dir.OpenDir(/tmp/data) failed.\n"); return -1; } CFile File; while (Dir.ReadDir()==true) { logfile.Write("處理文件%s...",Dir.m_FullFileName); if (File.Open(Dir.m_FullFileName,"r")==false) { logfile.WriteEx("failed.File.Open(%s) failed.\n",Dir.m_FullFileName); return -1; } // 這裏能夠插入讀取數據文件的內容、解析xml字符串並把數據寫入數據庫的代碼。 // 讀取文本數據用Fgets和FFGETS方法,讀取二進制數據用Fread方法。 // 具體的代碼我就不寫了。 // 處理完文件中的數據後,關閉文件指針,並刪除文件。 File.CloseAndRemove(); logfile.WriteEx("ok\n"); } logfile.Write("demo42程序運行結束。\n"); }
先運行demo39程序,在/tmp/data目錄中生成幾個數據文件,而後運行demo42,將生成日誌文件/tmp/log/demo42.log,內容以下:日誌
咱們經過一個示例程序的演示日誌文件的切換功能,往日誌文件中寫入一千萬數據,讓它產生切換。
示例(demo43.cpp)
/* * 程序名:demo43.cpp,此程序演示freecplus框架的CLogFile類的日誌文件的切換。 * 做者:C語言技術網(www.freecplus.net) 日期:20190525 */ #include "../_freecplus.h" int main() { CLogFile logfile; // 打開日誌文件,若是"/tmp/log"不存在,就建立它,可是要確保當前用戶具有建立目錄的權限。 if (logfile.Open("/tmp/log/demo43.log")==false) { printf("logfile.Open(/tmp/log/demo43.log) failed.\n"); return -1; } logfile.Write("demo43程序開始運行。\n"); // 讓程序循環10000000,生成足夠大的日誌。 for (int ii=0;ii<10000000;ii++) { logfile.Write("本程序演示日誌文件的切換,這是第%010%d條記錄。\n",ii); } logfile.Write("demo43程序運行結束。\n"); }
運行demo43,將在/tmp/log目錄中產生一批日誌文件,用ls -l /tmp/log查看以下:
C語言技術網原創文章,轉載請說明文章的來源、做者和原文的連接。
來源:C語言技術網(www.freecplus.net)
做者:碼農有道
若是這篇文章對您有幫助,請點贊支持,或在您的博客中轉發個人文章,謝謝!!!若是文章有錯別字,或者內容有錯誤,或其餘的建議和意見,請您留言指正,很是感謝!!!