Logger.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  1. #include "stdafx.h"
  2. #include "Logger.h"
  3. Logger* Logger::m_pLogger = NULL;
  4. CRITICAL_SECTION Logger::s_cs;
  5. int Logger::bInitialized = 0;
  6. tstring Logger::m_strLogDirOrFilePath = DEFAULT_LOG_NAME;
  7. FileModeEnum Logger::m_eFileMode = Default_Mode;
  8. Logger::CAutoWriteHelper Logger::helper;
  9. Logger::Logger(void)
  10. :m_bWriteRealTime(true),
  11. m_fileName(DEFAULT_LOG_NAME),
  12. //Change it for SpBranch
  13. m_usWriteStatus(LEVEL_INFOR_WRITEABLE),
  14. m_bufCurLen(0),
  15. hMutexForBuffer(NULL),
  16. hEventWrite(NULL)
  17. {
  18. QueryPerformanceFrequency(&m_liPerfFreq);
  19. m_strBuffer = TLOG_TEXT("");
  20. SetFileWriteMode(Day_Seperated_Mode);
  21. hMutexForBuffer = CreateMutex(NULL, FALSE, LPCTSTR("iGobalBuffer"));
  22. if(!m_bWriteRealTime)
  23. {
  24. hEventWrite = CreateEvent(NULL, TRUE, FALSE, TLOG_TEXT("iGobalTimerWriteEvent"));
  25. }
  26. }
  27. Logger::~Logger(void)
  28. {
  29. WaitForSingleObject(hMutexForBuffer, INFINITE);
  30. if(m_strBuffer.length() > 0)
  31. {
  32. bool retFlag = false;
  33. if(m_eFileMode == Day_Seperated_Mode)
  34. {
  35. m_fileName = GetCustomTime(For_File_Type);
  36. }
  37. retFlag = WriteToFile(m_strBuffer);
  38. if(retFlag)
  39. {
  40. m_strBuffer = TLOG_TEXT("");
  41. m_bufCurLen = 0;
  42. }
  43. }
  44. ReleaseMutex(hMutexForBuffer);
  45. if(hMutexForBuffer && hMutexForBuffer != INVALID_HANDLE_VALUE)
  46. {
  47. CloseHandle(hMutexForBuffer);
  48. hMutexForBuffer = NULL;
  49. }
  50. if(hEventWrite && hEventWrite != INVALID_HANDLE_VALUE)
  51. {
  52. CloseHandle(hEventWrite);
  53. hEventWrite = NULL;
  54. }
  55. DeleteCriticalSection(&s_cs);
  56. bInitialized = 0;
  57. }
  58. tstring Logger::GetCustomTime(DateTypeEnum type)
  59. {
  60. tchar strTime[MAX_TIME_LEN] = {0};
  61. time_t now;
  62. time(&now);
  63. tm *pTm = new tm;
  64. localtime_s(pTm, &now);
  65. if(type == For_File_Type)
  66. {
  67. _tcsftime(strTime, MAX_TIME_LEN*sizeof(tchar), TLOG_TEXT("%Y%m%d.log"), pTm);
  68. return (m_strLogDirOrFilePath + TLOG_TEXT("\\") + strTime);
  69. }
  70. else if(type == For_Record_Type)
  71. {
  72. _tcsftime(strTime, MAX_TIME_LEN*sizeof(tchar), TLOG_TEXT("[%Y/%m/%d %H:%M:%S] "), pTm);
  73. return tstring(strTime);
  74. }
  75. return TLOG_TEXT("");
  76. }
  77. tstring Logger::GetTimeOfDay()
  78. {
  79. FILETIME time;
  80. double timed;
  81. tchar strTime[MAX_TIME_LEN] = {0};
  82. GetSystemTimeAsFileTime( &time );
  83. // Apparently Win32 has units of 1e-7 sec (tenths of microsecs)
  84. // 4294967296 is 2^32, to shift high word over
  85. // 11644473600 is the number of seconds between
  86. // the Win32 epoch 1601-Jan-01 and the Unix epoch 1970-Jan-01
  87. // Tests found floating point to be 10x faster than 64bit int math.
  88. timed = ((time.dwHighDateTime * 4294967296e-7) - 11644473600.0) +
  89. (time.dwLowDateTime * 1e-7);
  90. tm *pTm = new tm;
  91. long temp = (long) timed;
  92. time_t clock = (long) timed;
  93. long appendix = (long) ((timed - temp) * 1e6);
  94. localtime_s(pTm, &clock);
  95. if(m_eFileMode == Day_Seperated_Mode)
  96. {
  97. _tcsftime(strTime, MAX_TIME_LEN, TLOG_TEXT("[%H:%M:%S"), pTm);
  98. }
  99. else
  100. {
  101. _tcsftime(strTime, MAX_TIME_LEN, TLOG_TEXT("[%Y/%m/%d %H:%M:%S"), pTm);
  102. }
  103. int nowLen = strlen(strTime);
  104. sprintf_s(strTime+nowLen, MAX_TIME_LEN-nowLen, TLOG_TEXT(",%03d] "), appendix / 1000);
  105. //
  106. //int appendix2 = appendix % 1000;
  107. //sprintf_s(strTime+nowLen, MAX_TIME_LEN-nowLen, ",%03d.%03d] ", appendix / 1000, appendix2);
  108. return tstring(strTime);
  109. }
  110. void Logger::Trace(tstring strInfo)
  111. {
  112. bool retFlag = false;
  113. WaitForSingleObject(hMutexForBuffer, INFINITE);
  114. m_strBuffer += strInfo;
  115. m_strBuffer += TLOG_TEXT("\r\n");
  116. //Compatable for RVC framework
  117. //m_strBuffer += strInfo;
  118. if(m_bWriteRealTime || m_strBuffer.length() > MAX_INFOR_LEN)
  119. {
  120. if(m_eFileMode == Day_Seperated_Mode)
  121. {
  122. m_fileName = GetCustomTime(For_File_Type);
  123. }
  124. //MessageBox(NULL, TLOG_TEXT(m_fileName.c_str()),
  125. // TLOG_TEXT(""), MB_ICONINFORMATION | MB_OK);
  126. retFlag = WriteToFile(m_strBuffer);
  127. if(retFlag)
  128. {
  129. m_strBuffer = TLOG_TEXT("");
  130. m_bufCurLen = 0;
  131. }
  132. }
  133. ReleaseMutex(hMutexForBuffer);
  134. }
  135. Logger* Logger::GetInstance()
  136. {
  137. EnterCriticalSection(&s_cs);
  138. if(m_pLogger == NULL)
  139. {
  140. m_pLogger = new Logger();
  141. //if(m_pLogger)
  142. //{
  143. // unsigned int threadID = 0;
  144. // HANDLE threadHD = (HANDLE)_beginthreadex(NULL, 0, Logger::TimerWriteProc, m_pLogger, 0, &threadID);
  145. // if(threadHD && threadHD != INVALID_HANDLE_VALUE)
  146. // {
  147. // CloseHandle(threadHD);
  148. // }
  149. //}
  150. }
  151. LeaveCriticalSection(&s_cs);
  152. return m_pLogger;
  153. }
  154. void Logger::InitLog(FileModeEnum eMode, const tchar* lpszDir)
  155. {
  156. if(bInitialized == 0)
  157. {
  158. InitializeCriticalSection(&s_cs);
  159. SetFileWriteMode(eMode, lpszDir);
  160. bInitialized = 1;
  161. }
  162. }
  163. void Logger::TraceInfor(const tchar* strInfo)
  164. {
  165. if((m_usWriteStatus & LEVEL_INFOR_WRITEABLE) != LEVEL_INFOR_WRITEABLE) return;
  166. tstring str(GetTimeOfDay()+TRACE_INFOR);
  167. str += strInfo;
  168. Trace(str);
  169. }
  170. void Logger::TraceDebug(const tchar* strInfo)
  171. {
  172. if((m_usWriteStatus & LEVEL_DEBUG_WRITEABLE) != LEVEL_DEBUG_WRITEABLE) return;
  173. tstring str(GetTimeOfDay()+TRACE_DEBUG);
  174. str += strInfo;
  175. Trace(str);
  176. }
  177. void Logger::TraceWarning(const tchar* strInfo)
  178. {
  179. if((m_usWriteStatus & LEVEL_WARNING_WRITEABLE) != LEVEL_WARNING_WRITEABLE) return;
  180. tstring str(GetTimeOfDay() + TRACE_WARNNING);
  181. str += strInfo;
  182. Trace(str);
  183. }
  184. void Logger::TraceError(const tchar* strInfo)
  185. {
  186. if((m_usWriteStatus & LEVEL_ERROR_WRITEABLE) != LEVEL_ERROR_WRITEABLE) return;
  187. tstring str(GetTimeOfDay() + TRACE_ERROR);
  188. str += strInfo;
  189. Trace(str);
  190. }
  191. void Logger::TraceDefault(const tchar* strInfo)
  192. {
  193. if((m_usWriteStatus & LEVEL_TRACE_WRITEABLE) != LEVEL_TRACE_WRITEABLE) return;
  194. tstring str(GetTimeOfDay() + TRACE_DEFAULT);
  195. str += strInfo;
  196. Trace(str);
  197. }
  198. void Logger::Trace_format(const tchar* fmt, va_list list_arg)
  199. {
  200. //_vstprintf_s
  201. int n;
  202. #ifdef UNICODE
  203. n = _vscwprintf(fmt, list_arg);
  204. #else
  205. n = _vscprintf(fmt, list_arg);
  206. #endif
  207. if(n > 0)
  208. {
  209. tchar *buf = new tchar[n+1];
  210. memset(buf, 0, sizeof(tchar)*(n+1));
  211. #ifdef UNICODE
  212. vswprintf_s(buf, n+1, fmt, list_arg);
  213. #else
  214. vsprintf_s(buf, n+1, fmt, list_arg);
  215. #endif
  216. Trace(tstring(buf));
  217. delete buf;
  218. buf = NULL;
  219. }
  220. va_end(list_arg);
  221. }
  222. void Logger::TraceInfor_f(const tchar* fmt, ...)
  223. {
  224. if((m_usWriteStatus & LEVEL_INFOR_WRITEABLE) != LEVEL_INFOR_WRITEABLE) return;
  225. tstring str(GetTimeOfDay()+TRACE_INFOR + fmt);
  226. va_list arg;
  227. va_start(arg, fmt);
  228. Trace_format(str.c_str(), arg);
  229. }
  230. void Logger::TraceDebug_f(const tchar* fmt, ...)
  231. {
  232. if((m_usWriteStatus & LEVEL_DEBUG_WRITEABLE) != LEVEL_DEBUG_WRITEABLE) return;
  233. tstring str(GetTimeOfDay()+TRACE_DEBUG + fmt);
  234. va_list arg;
  235. va_start(arg, fmt);
  236. Trace_format(str.c_str(), arg);
  237. }
  238. void Logger::TraceWarning_f(const tchar* fmt, ...)
  239. {
  240. if((m_usWriteStatus & LEVEL_WARNING_WRITEABLE) != LEVEL_WARNING_WRITEABLE) return;
  241. tstring str(GetTimeOfDay()+TRACE_WARNNING + fmt);
  242. va_list arg;
  243. va_start(arg, fmt);
  244. Trace_format(str.c_str(), arg);
  245. }
  246. void Logger::TraceError_f(const tchar* fmt, ...)
  247. {
  248. if((m_usWriteStatus & LEVEL_ERROR_WRITEABLE) != LEVEL_ERROR_WRITEABLE) return;
  249. tstring str(GetTimeOfDay()+TRACE_ERROR + fmt);
  250. va_list arg;
  251. va_start(arg, fmt);
  252. Trace_format(str.c_str(), arg);
  253. }
  254. void Logger::TraceDefault_f(const tchar* fmt, ...)
  255. {
  256. if((m_usWriteStatus & LEVEL_TRACE_WRITEABLE) != LEVEL_TRACE_WRITEABLE) return;
  257. tstring str(GetTimeOfDay()+TRACE_DEFAULT + fmt);
  258. va_list arg;
  259. va_start(arg, fmt);
  260. Trace_format(str.c_str(), arg);
  261. }
  262. /*获取当前调用该日志文件的程序路径或程序名称(无类型后缀),主用于日志名称声明
  263. *@param: [out] outFilePath 获取到程序路径或程序名称的字符串
  264. * [in] sizeLen outFilePath字符数组的大小
  265. * [in] fetchKind FALSE表示仅获取程序路径,TRUE表示获取程序名称
  266. *@return 如果获取成功则表示实际得到的字符串长度,-1表示失败
  267. */
  268. DWORD Logger::GetCurExeNameOrPath(tchar* outFilePath, int sizeLen, int fetchKind)
  269. {
  270. DWORD tmpDwRes = 0;
  271. if(sizeLen <= 0)
  272. return -1;
  273. memset(outFilePath, 0, sizeof(tchar)*sizeLen);
  274. if(tmpDwRes = GetModuleFileName(NULL, outFilePath, sizeLen) == 0)
  275. {
  276. _stprintf_s(outFilePath, sizeLen, TLOG_TEXT("GetModuleFileName failed %d"), GetLastError());
  277. return -1;
  278. }
  279. if(fetchKind == MODE_DEFAULT)
  280. {
  281. return tmpDwRes;
  282. }
  283. if(fetchKind == MODE_FILENAME_WITH_PATH)
  284. {
  285. tchar* pch2 = _tcsrchr(outFilePath, TLOG_TEXT('.'));
  286. if(pch2 == NULL)
  287. {
  288. return -1;
  289. }
  290. pch2[0] = TLOG_TEXT('\0');
  291. return (int)(pch2 - outFilePath);
  292. }
  293. tchar* pch1 = _tcsrchr(outFilePath, TLOG_TEXT('\\'));
  294. if(fetchKind == MODE_DIRECTORY)
  295. {
  296. if(pch1 == NULL)
  297. {
  298. return -1;
  299. }
  300. if(int(pch1 - outFilePath) + 1 < sizeLen)
  301. {
  302. *(pch1 + 1) = TLOG_TEXT('\0');
  303. }
  304. return (int)(pch1 - outFilePath + 1);
  305. }
  306. tchar tmpFilePath[MAX_PATH] = {0};
  307. int idx = 0;
  308. tchar* pstart = pch1 + 1;
  309. if(fetchKind == MODE_FILENAME)
  310. {
  311. for(; *pstart != TLOG_TEXT('\0'); idx++)
  312. {
  313. tmpFilePath[idx] = *pstart++;
  314. }
  315. tmpFilePath[idx] = TLOG_TEXT('\0');
  316. memcpy_s(outFilePath, sizeof(tchar)*sizeLen, tmpFilePath, sizeof(tchar)*(idx+1));
  317. return idx+1;
  318. }
  319. if(fetchKind == MODE_FILENAME_ONLY)
  320. {
  321. tchar* pch2 = _tcsrchr(outFilePath, TLOG_TEXT('.'));
  322. if(pch1 == NULL || pch2 == NULL)
  323. {
  324. return -1;
  325. }
  326. for(; pstart < pch2; idx++)
  327. {
  328. tmpFilePath[idx] = *pstart++;
  329. }
  330. tmpFilePath[idx] = TLOG_TEXT('\0');
  331. memcpy_s(outFilePath, sizeof(tchar)*sizeLen, tmpFilePath, sizeof(tchar)*(idx+1));
  332. return idx+1;
  333. }
  334. return -1;
  335. }
  336. void Logger::DelayLoop(unsigned long usec)
  337. {
  338. LOG_FUNCTION();
  339. LARGE_INTEGER freq, start, now;
  340. //返回硬件支持的高精度计数器的每秒钟嘀嗒的次数,零表示硬件不支持,读取失败
  341. if (!QueryPerformanceFrequency(&freq))
  342. {
  343. Sleep(usec);
  344. }
  345. else
  346. {
  347. QueryPerformanceCounter(&start);
  348. for(;;)
  349. {
  350. QueryPerformanceCounter((LARGE_INTEGER*) &now);
  351. if( ((double)(now.QuadPart - start.QuadPart) / (double)freq.QuadPart) * 1000 > usec ) break;
  352. }
  353. }
  354. }
  355. bool Logger::WriteToFile(tstring str)
  356. {
  357. bool flag = false;
  358. EnterCriticalSection(&s_cs);
  359. try
  360. {
  361. m_logStream.open(m_fileName.c_str(), tfstream::in | tfstream::app);
  362. if(!m_logStream)
  363. {
  364. //MessageBox(NULL, TLOG_TEXT(m_fileName.c_str()),
  365. // TLOG_TEXT(""), MB_ICONINFORMATION | MB_OK);
  366. str.clear();
  367. }
  368. else if(m_logStream.is_open())
  369. {
  370. m_logStream << str.c_str();// << endl;
  371. m_logStream.close();
  372. flag = true;
  373. }
  374. }
  375. catch (std::exception e)
  376. {
  377. str.clear();
  378. LeaveCriticalSection(&s_cs);
  379. return flag;
  380. }
  381. LeaveCriticalSection(&s_cs);
  382. return flag;
  383. }
  384. bool Logger::ClearToFile()
  385. {
  386. bool flag = false;
  387. WaitForSingleObject(hMutexForBuffer, INFINITE);
  388. if(m_strBuffer.length() > 0)
  389. {
  390. if(m_eFileMode == Day_Seperated_Mode)
  391. {
  392. m_fileName = GetCustomTime(For_File_Type);
  393. }
  394. flag = WriteToFile(m_strBuffer);
  395. if(flag)
  396. {
  397. m_strBuffer = TLOG_TEXT("");
  398. m_bufCurLen = 0;
  399. }
  400. }
  401. ReleaseMutex(hMutexForBuffer);
  402. return flag;
  403. }
  404. void Logger::EndLog()
  405. {
  406. if(m_pLogger != NULL)
  407. {
  408. delete m_pLogger;
  409. m_pLogger = NULL;
  410. }
  411. }
  412. int Logger::FormatLastError(tchar* szOutMsg, unsigned int sizeLen, DWORD erroCode)
  413. {
  414. if(sizeLen == 0 || szOutMsg == NULL)
  415. return 0;
  416. LPVOID lpMsgBuf;
  417. if(erroCode == 0)
  418. {
  419. erroCode = GetLastError();
  420. }
  421. if(!FormatMessage(
  422. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  423. FORMAT_MESSAGE_FROM_SYSTEM |
  424. FORMAT_MESSAGE_MAX_WIDTH_MASK,
  425. NULL,
  426. erroCode,
  427. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  428. (LPTSTR) &lpMsgBuf,
  429. 0, NULL ))
  430. {
  431. return 0;
  432. }
  433. _tcscpy_s(szOutMsg, sizeLen,(LPCTSTR)lpMsgBuf);
  434. LocalFree(lpMsgBuf);
  435. return _tcslen(szOutMsg);
  436. }
  437. void Logger::Start()
  438. {
  439. QueryPerformanceCounter(&m_liPerfStart);
  440. }
  441. __int64 Logger::Now() const
  442. {
  443. LARGE_INTEGER liPerfNow;
  444. QueryPerformanceCounter(&liPerfNow);
  445. return (((liPerfNow.QuadPart - m_liPerfStart.QuadPart) * 1000) / m_liPerfFreq.QuadPart);
  446. }
  447. __int64 Logger::NowInMicro() const
  448. {
  449. LARGE_INTEGER liPerfNow;
  450. QueryPerformanceCounter(&liPerfNow);
  451. return (((liPerfNow.QuadPart - m_liPerfStart.QuadPart) * 1000000) / m_liPerfFreq.QuadPart);
  452. }
  453. void Logger::TraceErrWithLastCode(const tchar* strInfo)
  454. {
  455. DWORD dwErrCode = GetLastError();
  456. TCHAR szMsg[MIN_INFOR_LEN] = {0};
  457. int nLen = FormatLastError(szMsg, MIN_INFOR_LEN, dwErrCode);
  458. TraceError_f(TLOG_TEXT("%s : (%d)%s."), strInfo, dwErrCode, szMsg);
  459. return;
  460. }
  461. void Logger::SetFileWriteMode(FileModeEnum eMode, const tchar* lpszDir)
  462. {
  463. tchar fileName[MAX_PATH] = {0};
  464. if(eMode == Single_File_Mode)
  465. {
  466. if(lpszDir == NULL || strlen(lpszDir) <= 0)
  467. {
  468. if(GetCurExeNameOrPath(fileName, MAX_PATH, MODE_FILENAME_WITH_PATH) != -1)
  469. {
  470. _tcscat_s(fileName, MAX_PATH*sizeof(tchar), TLOG_TEXT("_log.txt"));
  471. m_strLogDirOrFilePath = fileName;
  472. m_eFileMode = Single_File_Mode;
  473. if(m_pLogger != NULL && m_pLogger->RefleshFileName()){;}
  474. return;
  475. }
  476. }
  477. else
  478. {
  479. if(GetCurExeNameOrPath(fileName, MAX_PATH, MODE_FILENAME_ONLY) != -1)
  480. {
  481. _tcscat_s(fileName, MAX_PATH*sizeof(tchar), TLOG_TEXT("_log.txt"));
  482. m_strLogDirOrFilePath = lpszDir;
  483. const tchar* pchSuffix = _tcsrchr(lpszDir, TLOG_TEXT('\\'));
  484. if(pchSuffix == NULL || pchSuffix[1] != '\0')
  485. {
  486. m_strLogDirOrFilePath += tstring("\\");
  487. }
  488. m_strLogDirOrFilePath += fileName;
  489. m_eFileMode = Single_File_Mode;
  490. if(m_pLogger != NULL && m_pLogger->RefleshFileName()){;}
  491. return;
  492. }
  493. }
  494. }
  495. else if(eMode == Day_Seperated_Mode)
  496. {
  497. if(strlen(lpszDir) <= 0)
  498. {
  499. if(GetCurExeNameOrPath(fileName, MAX_PATH, MODE_DIRECTORY) == -1)
  500. return;
  501. m_strLogDirOrFilePath = tstring(fileName) + TLOG_TEXT("LogFiles");
  502. }
  503. else
  504. {
  505. const tchar* pchSuffix = _tcsrchr(lpszDir, TLOG_TEXT('\\'));
  506. if(pchSuffix != NULL && pchSuffix[1] == '\0')
  507. {
  508. _tcscpy_s(fileName, MAX_PATH*sizeof(tchar), lpszDir);
  509. fileName[strlen(fileName)-1] = TLOG_TEXT('\0');
  510. m_strLogDirOrFilePath = tstring(fileName);
  511. }
  512. else
  513. {
  514. m_strLogDirOrFilePath = lpszDir;
  515. }
  516. //MessageBox(NULL, TLOG_TEXT(m_strLogDirOrFilePath.c_str()),
  517. // TLOG_TEXT(""), MB_ICONINFORMATION | MB_OK);
  518. }
  519. #ifndef UNICODE
  520. if(_access(m_strLogDirOrFilePath.c_str(), 0) == -1)
  521. #else
  522. char tlsDirectory[MAX_PATH] = {0};
  523. int nt = WideCharToMultiByte(CP_ACP, 0, m_strLogDirOrFilePath.c_str(), -1, tlsDirectory, MAX_PATH, NULL, NULL);
  524. if(_access(tlsDirectory, 0) == -1)
  525. #endif
  526. {
  527. CreateDirectory(m_strLogDirOrFilePath.c_str(), NULL);
  528. }
  529. m_eFileMode = Day_Seperated_Mode;
  530. }
  531. else if(eMode == Default_Mode)
  532. {
  533. m_eFileMode = Default_Mode;
  534. m_strLogDirOrFilePath = DEFAULT_LOG_NAME;
  535. if(m_pLogger != NULL && m_pLogger->RefleshFileName()){;}
  536. }
  537. }
  538. const tchar * _GetFileNameForLog(const tchar *pszFilePath)
  539. {
  540. if(pszFilePath == NULL || _tcslen(pszFilePath) == 0)
  541. return TLOG_TEXT("empty");
  542. const tchar* backlash = _tcsrchr(pszFilePath, (int)(TLOG_TEXT('\\')));
  543. if(!backlash)
  544. {
  545. return pszFilePath;
  546. }
  547. return (backlash+1);
  548. }
  549. unsigned int _stdcall Logger::CAutoWriteHelper::TimerWriteProc(void* param)
  550. {
  551. if(param == nullptr)
  552. {
  553. return -1;
  554. }
  555. Logger::CAutoWriteHelper* helper = (Logger::CAutoWriteHelper*)param;
  556. HANDLE hEvent = helper->GetLogTimerEvent();
  557. BOOL bLoop = TRUE;
  558. if(!hEvent)
  559. {
  560. return 0;
  561. }
  562. while(bLoop)
  563. {
  564. DWORD dwRet = WaitForSingleObject(hEvent, TIME_TO_WRITE_LOG);
  565. switch(dwRet)
  566. {
  567. case WAIT_OBJECT_0:
  568. //WRITE_TRACE_PARAM(TLOG_TEXT("WAIT_OBJECT_0"));
  569. helper->WriteToLog();
  570. bLoop = FALSE;
  571. break;
  572. case WAIT_TIMEOUT:
  573. //WRITE_TRACE_PARAM(TLOG_TEXT("WAIT_TIMEOUT"));
  574. helper->WriteToLog();
  575. break;
  576. case WAIT_FAILED:
  577. WRITE_TRACE_PARAM(TLOG_TEXT("WAIT_FAILED"));
  578. bLoop = FALSE;
  579. break;
  580. }
  581. }
  582. //WRITE_TRACE_PARAM(TLOG_TEXT("hiahiahia"));
  583. return 0;
  584. }