CLogFile.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. #include "stdafx.h"
  2. #include "CLogFile.h"
  3. CCLogFile::CCLogFile(LPCTSTR szFileName, bool bLogNeedManage)
  4. :m_bFileNameCommited(!bLogNeedManage)
  5. {
  6. SYSTEMTIME __sTime;
  7. ::GetLocalTime(&__sTime);
  8. if (NULL != szFileName)
  9. {
  10. m_szFile = szFileName;
  11. CString str;
  12. str.Format("%s %04d%02d%02d%02d%02d%02d%03d.log", m_szFile, __sTime.wYear, __sTime.wMonth, __sTime.wDay, __sTime.wHour, __sTime.wMinute, __sTime.wSecond, __sTime.wMilliseconds);
  13. m_szFile = str;
  14. // AfxMessageBox(m_szFile);
  15. }
  16. else
  17. {
  18. m_szFile = "hc_trace";
  19. }
  20. }
  21. CCLogFile::~CCLogFile()
  22. {
  23. }
  24. /**
  25. 纪录操作处理信息,以及信息对应的文件名和所在行,其他同C的printf用法
  26. 比如在A.CPP文件的第11行进行如下调用:
  27. TraceProgress( __FILE__, __LINE__, "hi test[%d]", 3 );
  28. 则相当于:
  29. Print( TRACER_OPE_PROGRESS, "%s:%d hi test[%d]", "A.CPP", 11, 3 );
  30. @param szFile 信息对应的源文件名
  31. @param lLine 信息所对应的行数
  32. @param szData 格式字符串
  33. @param ... 后续内容
  34. @return 无
  35. @see Print(TRACER_TYPE nType, LPCTSTR szData, ...)
  36. */
  37. ///@endcond
  38. ///@cond CHS
  39. /**
  40. Log process type information
  41. example:
  42. TraceProgress( __FILE__, __LINE__, "hi test[%d]", 3 );
  43. @param szFile File name
  44. @param lLine Program line
  45. @param szData Format string
  46. @param ... Other param
  47. */
  48. void CCLogFile::TraceProgress(LPCTSTR szFile, long lLine, LPCTSTR szData, ...)
  49. {
  50. CString str;
  51. str.Format("%s(%ld) ", szFile, lLine);
  52. str.Append(szData);
  53. va_list pArgList;
  54. va_start(pArgList, szData);
  55. PrintV(TRACER_OPE_PROGRESS, str, pArgList);
  56. va_end(pArgList);
  57. }
  58. /**
  59. 纪录错误信息,以及信息对应的文件名和所在行,其他同C的printf用法
  60. 比如在A.CPP文件的第11行进行如下调用:
  61. TraceError( __FILE__, __LINE__, "hi test[%d]", 3 );
  62. 则相当于:
  63. Print( TRACER_OPE_ERROR, "%s:%d hi test[%d]", "A.CPP", 11, 3 );
  64. @param szFile 信息对应的源文件名
  65. @param lLine 信息所对应的行数
  66. @param szData 格式字符串
  67. @param ... 后续内容
  68. @return 无
  69. @see Print(TRACER_TYPE nType, LPCTSTR szData, ...)
  70. */
  71. ///@endcond
  72. ///@cond ENG
  73. /**
  74. Log error information
  75. example:
  76. TraceError( __FILE__, __LINE__, "hi test[%d]", 3 );
  77. @param szFile File name
  78. @param lLine Program line
  79. @param szData Format string
  80. @param ... Other param
  81. */
  82. ///@endcond
  83. void CCLogFile::TraceError(LPCTSTR szFile, long lLine, LPCTSTR szData, ...)
  84. {
  85. CString str;
  86. str.Format("%s(%ld) ", szFile, lLine);
  87. str.Append(szData);
  88. va_list pArgList;
  89. va_start(pArgList, szData);
  90. PrintV(TRACER_OPE_ERROR, str, pArgList);
  91. va_end(pArgList);
  92. }
  93. /**
  94. 纪录例外信息,以及信息对应的文件名和所在行,其他同C的printf用法
  95. 比如在A.CPP文件的第11行进行如下调用:
  96. TraceException( __FILE__, __LINE__, "hi test[%d]", 3 );
  97. 则相当于:
  98. Print( TRACER_OPE_EXCEPTION, "%s:%d hi test[%d]", "A.CPP", 11, 3 );
  99. @param szFile 信息对应的源文件名
  100. @param lLine 信息所对应的行数
  101. @param szData 格式字符串
  102. @param ... 后续内容
  103. @return 无
  104. @see Print(TRACER_TYPE nType, LPCTSTR szData, ...)
  105. */
  106. ///@endcond
  107. ///@cond ENG
  108. /**
  109. Log exception information
  110. example:
  111. TraceException( __FILE__, __LINE__, "hi test[%d]", 3 );
  112. @param szFile File name
  113. @param lLine Program line
  114. @param szData Format string
  115. @param ... Other param
  116. */
  117. ///@endcond
  118. void CCLogFile::TraceException(LPCTSTR szFile, long lLine, LPCTSTR szData, ...)
  119. {
  120. CString str;
  121. str.Format("%s(%ld) ", szFile, lLine);
  122. str.Append(szData);
  123. va_list pArgList;
  124. va_start(pArgList, szData);
  125. PrintV(TRACER_OPE_EXCEPTION, str, pArgList);
  126. va_end(pArgList);
  127. }
  128. /**
  129. Log normal information
  130. example:
  131. TraceMessage( __FILE__, __LINE__, "hi test[%d]", 3 );
  132. @param szFile File name
  133. @param lLine Program line
  134. @param szData Format string
  135. @param ... Other param
  136. */
  137. ///@endcond
  138. void CCLogFile::TraceMessage(LPCTSTR szFile, long lLine, LPCTSTR szData, ...)
  139. {
  140. CString str;
  141. str.Format("%s(%ld) ", szFile, lLine);
  142. str.Append(szData);
  143. va_list pArgList;
  144. va_start(pArgList, szData);
  145. PrintV(TRACER_OPE_MESSAGE, str, pArgList);
  146. va_end(pArgList);
  147. }
  148. /**
  149. 记录二进制数据
  150. @param szHead 信息头
  151. @param pbyData 数据
  152. @param nLen 数据长度
  153. */
  154. ///@endcond
  155. ///@cond ENG
  156. /**
  157. Log binary data
  158. @param szHead Information
  159. @param pbyData Binary data
  160. @param nLen Data length
  161. */
  162. ///@endcond
  163. void CCLogFile::LogBinaryData(LPCTSTR szHead, BYTE* pbyData, UINT nLen)
  164. {
  165. SYSTEMTIME __sTime;
  166. ::GetLocalTime(&__sTime);
  167. CString str;
  168. str.Format("%s.%04d%02d%02d", m_szFile, __sTime.wYear, __sTime.wMonth, __sTime.wDay);
  169. CSingleLock lock(&this->m_csBinLog, TRUE);
  170. HANDLE hLog = this->CreateLogFile(str);
  171. if (INVALID_HANDLE_VALUE == hLog)
  172. {
  173. return;
  174. }
  175. if (!szHead)
  176. {
  177. szHead = __T(" ");
  178. }
  179. str.Format("%02d:%02d:%02d.%03d|%4d| ---> %s\r\n ----------------------------------------------------------------------------\r\n", __sTime.wHour, __sTime.wMinute, __sTime.wSecond, __sTime.wMilliseconds
  180. , GetCurrentThreadId(), szHead);
  181. DWORD iLen = str.GetLength();
  182. DWORD unBytesWritten = 0;
  183. WriteFile(hLog, str, iLen, &unBytesWritten, NULL);
  184. int iSeq = 0;
  185. CString strBin;
  186. const int BYTES_PER_LINE = 16;
  187. const int SEQ_LEN = 6;
  188. char szWkBuf[128], szCharBuf[BYTES_PER_LINE + 1];
  189. for (unsigned int iIndex = 0; iIndex < nLen; )
  190. {
  191. //000001: 12 34 56 78 AB CD EF 12 34 56 78 12 12 12 12 12 ...............
  192. sprintf(szWkBuf, " %0*d: ", SEQ_LEN, iSeq++);
  193. strBin = szWkBuf;
  194. memset(szCharBuf, 0, sizeof(szCharBuf));
  195. for (unsigned int i = 0; i < BYTES_PER_LINE && iIndex < nLen; ++i)
  196. {
  197. sprintf(szWkBuf, "%02X ", pbyData[iIndex]);
  198. strBin += szWkBuf;
  199. sprintf(szCharBuf + strlen(szCharBuf), "%c", pbyData[iIndex] < 0x20 ? '.' : pbyData[iIndex]);
  200. ++iIndex;
  201. }
  202. if (iIndex % 16)
  203. {
  204. strBin += CString(' ', 3 * (16 - iIndex % 16));
  205. }
  206. str.Format("%s; %s\r\n", strBin, szCharBuf);
  207. iLen = str.GetLength();
  208. unBytesWritten = 0;
  209. WriteFile(hLog, str, iLen, &unBytesWritten, NULL);
  210. }
  211. str = " ----------------------------------------------------------------------------\r\n\r\n";
  212. iLen = str.GetLength();
  213. WriteFile(hLog, str, iLen, &unBytesWritten, NULL);
  214. if (INVALID_HANDLE_VALUE != hLog)
  215. {
  216. CloseHandle(hLog);
  217. }
  218. }
  219. /**
  220. 采用va_list形式的可变参数打印
  221. @param nType 纪录类型
  222. - TRACER_OPE_PROGRESS
  223. - TRACER_OPE_ERROR
  224. - TRACER_OPE_EXCEPTION
  225. - TRACER_OPE_MESSAGE
  226. @param pszFormat 打印格式
  227. @param pArgList 可变参数列表指针
  228. */
  229. ///@endcond
  230. //@cond ENG
  231. /**
  232. Use va_list to Log information
  233. @param nType Information type
  234. - TRACER_OPE_PROGRESS
  235. - TRACER_OPE_ERROR
  236. - TRACER_OPE_EXCEPTION
  237. - TRACER_OPE_MESSAGE
  238. @param pszFormat Format string
  239. @param pArgList arguments
  240. */
  241. ///@endcond
  242. void CCLogFile::PrintV(TRACER_TYPE nType, LPCTSTR pszFormat, va_list pArgList)
  243. {
  244. CString strFormat;
  245. switch (nType)
  246. {
  247. case TRACER_OPE_PROGRESS:
  248. strFormat = TRACER_OPE_PROGRESS_STR;
  249. break;
  250. case TRACER_OPE_ERROR:
  251. strFormat = TRACER_OPE_ERROR_STR;
  252. break;
  253. case TRACER_OPE_EXCEPTION:
  254. strFormat = TRACER_OPE_EXCEPTION_STR;
  255. break;
  256. case TRACER_OPE_MESSAGE:
  257. strFormat = TRACER_OPE_MESSAGE_STR;
  258. break;
  259. default:
  260. strFormat = ("$$ UNKONW: ");
  261. }
  262. strFormat.Append(pszFormat);
  263. PrintV(strFormat, pArgList);
  264. }
  265. //@cond CHS
  266. /**
  267. 采用va_list形式的可变参数打印
  268. @param pszFormat 打印格式
  269. @param pArgList 可变参数列表指针
  270. */
  271. ///@endcond
  272. //@cond ENG
  273. /**
  274. Use va_list to Log information
  275. @param pszFormat Format string
  276. @param pArgList arguments
  277. */
  278. ///@endcond
  279. void CCLogFile::PrintV(LPCTSTR pszFormat, va_list pArgList)
  280. {
  281. CString str;
  282. str.FormatV(pszFormat, pArgList);
  283. str.Append(("\r\n"));
  284. //TRACE( str );
  285. LogFile(str);
  286. }
  287. /**
  288. 生成文件
  289. @param szData 数据
  290. */
  291. ///@endcond
  292. ///@cond ENG
  293. ///Log file
  294. ///@param szData Data need log to file
  295. ///@endcond
  296. void CCLogFile::LogFile(LPCTSTR szData)
  297. {
  298. SYSTEMTIME __sTime;
  299. ::GetLocalTime(&__sTime);
  300. /*
  301. CString str;
  302. str.Format(L"%s %04d%02d%02d%02d:%02d:%02d.%03d.log", m_szFile, __sTime.wYear, __sTime.wMonth, __sTime.wDay, __sTime.wHour, __sTime.wMinute, __sTime.wSecond, __sTime.wMilliseconds); */
  303. CString str;
  304. str.Format("%s", m_szFile);
  305. CSingleLock lock(&this->m_csLog, TRUE);
  306. HANDLE hLog = this->CreateLogFile(str);
  307. if (INVALID_HANDLE_VALUE == hLog)
  308. {
  309. return;
  310. }
  311. str.Format("%02d:%02d:%02d.%03d | ", __sTime.wHour, __sTime.wMinute, __sTime.wSecond, __sTime.wMilliseconds);
  312. // str = "";
  313. DWORD iLen = str.GetLength();
  314. DWORD unBytesWritten = 0;
  315. WriteFile(hLog, str, iLen, &unBytesWritten, NULL);
  316. iLen = (DWORD)_tcslen(szData) * sizeof(TCHAR);
  317. WriteFile(hLog, szData, iLen, &unBytesWritten, NULL);
  318. OutputDebugString(szData);
  319. if (INVALID_HANDLE_VALUE != hLog)
  320. {
  321. CloseHandle(hLog);
  322. }
  323. }
  324. /**
  325. 创建日志文件
  326. /@param str 文件名
  327. */
  328. ///@endcond
  329. ///@cond ENG
  330. ///Create log file
  331. ///@param str File Name
  332. ///@endcond
  333. HANDLE CCLogFile::CreateLogFile(const CString& str)
  334. {
  335. HANDLE hLog = INVALID_HANDLE_VALUE;
  336. hLog = CreateFile(str, GENERIC_READ | GENERIC_WRITE,
  337. FILE_SHARE_READ | FILE_SHARE_WRITE,
  338. NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,
  339. NULL);
  340. if (INVALID_HANDLE_VALUE == hLog)
  341. {
  342. if (CheckFilePath(str))
  343. {
  344. hLog = CreateFile(str, GENERIC_READ | GENERIC_WRITE,
  345. FILE_SHARE_READ | FILE_SHARE_WRITE,
  346. NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,
  347. NULL);
  348. }
  349. }
  350. if (INVALID_HANDLE_VALUE != hLog)
  351. {
  352. SetFilePointer(hLog, 0, NULL, FILE_END);
  353. }
  354. if (!this->m_bFileNameCommited)
  355. {
  356. this->m_bFileNameCommited = true;
  357. }
  358. return hLog;
  359. }
  360. bool CCLogFile::CheckFilePath(const CString& strPath)
  361. {
  362. if (strPath.IsEmpty())
  363. {
  364. return false;
  365. }
  366. int iPos = strPath.ReverseFind('\\');
  367. if (iPos < 0)
  368. {
  369. iPos = strPath.ReverseFind('/');
  370. if (iPos < 0)
  371. {
  372. return false;
  373. }
  374. }
  375. CString cstrPath = strPath.Left(iPos);
  376. return TRUE;
  377. }
  378. void CUtilityTools::WaitingWithEventLoop(int iWaitTime)
  379. {
  380. /* if (a_bWithEventLoop)
  381. {
  382. auto* pApp = AfxGetApp();
  383. if (pApp)
  384. {
  385. AMICS::UI::CAMICSAppBase* pBaseApp = dynamic_cast<AMICS::UI::CAMICSAppBase*>(pApp);
  386. if (pBaseApp)
  387. {
  388. pBaseApp->WaitingWithEventLoop(a_nMilliseconds);
  389. return;
  390. }
  391. }
  392. }*/
  393. //LogTrace(_T("Waiting %d milliseconds ..."), a_nMilliseconds);
  394. #pragma warning(disable: 28159)
  395. DWORD nStart = GetTickCount();
  396. DWORD nEnd = nStart;
  397. do
  398. {
  399. nEnd = GetTickCount();
  400. } while (nEnd >= nStart && nEnd <= (nStart + iWaitTime + 1));
  401. #pragma warning(default: 28159)
  402. }