特点 1 采用双文件记录日志信息 2 当一个文件写满后,清空另外一个文件继续写入 3 可设置最大日志文件大小 4 文本文件使用unicode进行编码 #define DEFAULT_STR_BUFF_LEN 2048 class DoubleLog { public: DoubleLog(void); ~DoubleLog(void); bool Init(const string& logFileName); void SetMaxBytes(int nbyte); //void Close(void); bool WriteLog(LPCWSTR lpszFormat,...); private: static char lineEnd[4]; static char newufile[2]; static bool bclog; fstream fs; string filename1; string filename2; int maxLength; //bool isOpen; wchar_t szMsg[DEFAULT_STR_BUFF_LEN]; //streampos curFilePos; bool bfile1; bool WriteFileHead(); void ChangePoint(); bool OpenFile(); bool CheckFStream(); bool OpenNewFile(); }; LPWSTR getNowTimeW(LPWSTR pbuff) { SYSTEMTIME cSystime; GetLocalTime(&cSystime); //wchar_t pbuff[24] = {0}; swprintf_s(pbuff, 20, L"%04d-%02d-%02d %02d:%02d:%02d", cSystime.wYear, cSystime.wMonth, cSystime.wDay, cSystime.wHour, cSystime.wMinute, cSystime.wSecond); //return wstring(pbuff); return pbuff; } #include <strsafe.h> #define DEFAULT_MAX_BUFF_LEN (1024*1024) char DoubleLog::lineEnd[4] = {0x0d,0x00,0x0a,0x00}; char DoubleLog::newufile[2] = {0xff,0xfe}; bool DoubleLog::bclog = false; DoubleLog::DoubleLog(void) : maxLength(DEFAULT_MAX_BUFF_LEN) { if (!bclog) { CreateDirectory(L"log",NULL); bclog = true; } bfile1 = true; } DoubleLog::~DoubleLog(void) { } int GetFstreamLen(fstream& infile) { streampos cp = infile.tellg(); infile.seekg( 0, ios_base::end ); streampos len = infile.tellg(); infile.seekg( 0, cp ); return len; } bool DoubleLog::WriteFileHead() { fs.write(newufile,2); return true; } void DoubleLog::ChangePoint() { bfile1 = !bfile1; } bool DoubleLog::OpenFile() { string fname; if (bfile1) { fname = filename1; } else { fname = filename2; } if (fs.is_open()) { fs.close(); } fs.open(fname.c_str(),ios_base::app | ios_base::out | ios_base::binary); if (! fs.is_open()) { return false; } return true; } bool DoubleLog::OpenNewFile() { string fname; if (bfile1) { fname = filename1; } else { fname = filename2; } if (fs.is_open()) { fs.close(); } fs.open(fname.c_str(), ios::trunc | ios_base::out | ios_base::binary); if (! fs.is_open()) { return false; } WriteFileHead(); return true; } bool DoubleLog::CheckFStream() { if (!fs.is_open()) { return false; } WriteFileHead(); streampos curpos = fs.tellp(); streampos zp = 2; if (curpos == zp) { return true; } if (curpos >= maxLength) { return false; } return true; } bool DoubleLog::Init(const string& logFileName) { string curD("log/"); filename1 = curD + logFileName + ".txt"; filename2 = curD +logFileName + "_2.txt"; OpenFile(); if (!CheckFStream()) { fs.close(); ChangePoint(); OpenFile(); CheckFStream(); } return true; } bool DoubleLog::WriteLog(LPCWSTR lpszFormat,...) { va_list argList; va_start(argList, lpszFormat); HRESULT hr; hr = StringCchVPrintfW(szMsg,DEFAULT_STR_BUFF_LEN,lpszFormat,argList); if (hr == S_OK || hr == STRSAFE_E_INSUFFICIENT_BUFFER) { szMsg[DEFAULT_STR_BUFF_LEN - 1]=0; } va_end(argList); wchar_t szfbuff[24] = {0}; getNowTimeW(szfbuff); szfbuff[wcslen(szfbuff)] = L' '; szfbuff[wcslen(szfbuff)] = 0; fs.write((char*)szfbuff, wcslen(szfbuff) * 2); fs.write((char*)szMsg, wcslen(szMsg) * 2); fs.write(lineEnd,4); fs.flush(); streampos curpos = fs.tellp(); if (curpos >= maxLength || !(fs.good())) { fs.close(); ChangePoint(); OpenNewFile(); } return true; } void DoubleLog::SetMaxBytes(int nbyte) { if (nbyte<512 || nbyte > 500*1024*1024) { return; } maxLength = nbyte; }