123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482 |
- #include "Logstdafx.h"
- #include "CLogFile.h"
- CCLogFile::CCLogFile(LPCTSTR szFileName, bool bLogNeedManage)
- :m_bFileNameCommited(!bLogNeedManage)
- {
- SYSTEMTIME __sTime;
- ::GetLocalTime(&__sTime);
- if (NULL != szFileName)
- {
- m_szFile = szFileName;
- CString str;
- 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);
- m_szFile = str;
- }
- else
- {
- m_szFile = "hc_trace";
- }
- }
- CCLogFile::~CCLogFile()
- {
- }
- /**
- 纪录操作处理信息,以及信息对应的文件名和所在行,其他同C的printf用法
- 比如在A.CPP文件的第11行进行如下调用:
- TraceProgress( __FILE__, __LINE__, "hi test[%d]", 3 );
- 则相当于:
- Print( TRACER_OPE_PROGRESS, "%s:%d hi test[%d]", "A.CPP", 11, 3 );
- @param szFile 信息对应的源文件名
- @param lLine 信息所对应的行数
- @param szData 格式字符串
- @param ... 后续内容
- @return 无
- @see Print(TRACER_TYPE nType, LPCTSTR szData, ...)
- */
- ///@endcond
- ///@cond CHS
- /**
- Log process type information
- example:
- TraceProgress( __FILE__, __LINE__, "hi test[%d]", 3 );
- @param szFile File name
- @param lLine Program line
- @param szData Format string
- @param ... Other param
- */
- void CCLogFile::TraceProgress(LPCTSTR szFile, long lLine, LPCTSTR szData, ...)
- {
- CString str;
- str.Format("%s(%ld) ", szFile, lLine);
- str.Append(szData);
- va_list pArgList;
- va_start(pArgList, szData);
- PrintV(TRACER_OPE_PROGRESS, str, pArgList);
- va_end(pArgList);
- }
- /**
- 纪录错误信息,以及信息对应的文件名和所在行,其他同C的printf用法
- 比如在A.CPP文件的第11行进行如下调用:
- TraceError( __FILE__, __LINE__, "hi test[%d]", 3 );
- 则相当于:
- Print( TRACER_OPE_ERROR, "%s:%d hi test[%d]", "A.CPP", 11, 3 );
- @param szFile 信息对应的源文件名
- @param lLine 信息所对应的行数
- @param szData 格式字符串
- @param ... 后续内容
- @return 无
- @see Print(TRACER_TYPE nType, LPCTSTR szData, ...)
- */
- ///@endcond
- ///@cond ENG
- /**
- Log error information
- example:
- TraceError( __FILE__, __LINE__, "hi test[%d]", 3 );
- @param szFile File name
- @param lLine Program line
- @param szData Format string
- @param ... Other param
- */
- ///@endcond
- void CCLogFile::TraceError(LPCTSTR szFile, long lLine, LPCTSTR szData, ...)
- {
- CString str;
- str.Format("%s(%ld) ", szFile, lLine);
- str.Append(szData);
- va_list pArgList;
- va_start(pArgList, szData);
- PrintV(TRACER_OPE_ERROR, str, pArgList);
- va_end(pArgList);
- }
- /**
- 纪录例外信息,以及信息对应的文件名和所在行,其他同C的printf用法
- 比如在A.CPP文件的第11行进行如下调用:
- TraceException( __FILE__, __LINE__, "hi test[%d]", 3 );
- 则相当于:
- Print( TRACER_OPE_EXCEPTION, "%s:%d hi test[%d]", "A.CPP", 11, 3 );
- @param szFile 信息对应的源文件名
- @param lLine 信息所对应的行数
- @param szData 格式字符串
- @param ... 后续内容
- @return 无
- @see Print(TRACER_TYPE nType, LPCTSTR szData, ...)
- */
- ///@endcond
- ///@cond ENG
- /**
- Log exception information
- example:
- TraceException( __FILE__, __LINE__, "hi test[%d]", 3 );
- @param szFile File name
- @param lLine Program line
- @param szData Format string
- @param ... Other param
- */
- ///@endcond
- void CCLogFile::TraceException(LPCTSTR szFile, long lLine, LPCTSTR szData, ...)
- {
- CString str;
- str.Format("%s(%ld) ", szFile, lLine);
- str.Append(szData);
- va_list pArgList;
- va_start(pArgList, szData);
- PrintV(TRACER_OPE_EXCEPTION, str, pArgList);
- va_end(pArgList);
- }
- /**
- Log normal information
- example:
- TraceMessage( __FILE__, __LINE__, "hi test[%d]", 3 );
- @param szFile File name
- @param lLine Program line
- @param szData Format string
- @param ... Other param
- */
- ///@endcond
- void CCLogFile::TraceMessage(LPCTSTR szFile, long lLine, LPCTSTR szData, ...)
- {
- CString str;
- str.Format("%s(%ld) ", szFile, lLine);
- str.Append(szData);
- va_list pArgList;
- va_start(pArgList, szData);
- PrintV(TRACER_OPE_MESSAGE, str, pArgList);
- va_end(pArgList);
- }
- /**
- 记录二进制数据
- @param szHead 信息头
- @param pbyData 数据
- @param nLen 数据长度
- */
- ///@endcond
- ///@cond ENG
- /**
- Log binary data
- @param szHead Information
- @param pbyData Binary data
- @param nLen Data length
- */
- ///@endcond
- void CCLogFile::LogBinaryData(LPCTSTR szHead, BYTE* pbyData, UINT nLen)
- {
- SYSTEMTIME __sTime;
- ::GetLocalTime(&__sTime);
- CString str;
- str.Format("%s.%04d%02d%02d", m_szFile, __sTime.wYear, __sTime.wMonth, __sTime.wDay);
- CSingleLock lock(&this->m_csBinLog, TRUE);
- HANDLE hLog = this->CreateLogFile(str);
- if (INVALID_HANDLE_VALUE == hLog)
- {
- return;
- }
- if (!szHead)
- {
- szHead = __T(" ");
- }
- str.Format("%02d:%02d:%02d.%03d|%4d| ---> %s\r\n ----------------------------------------------------------------------------\r\n", __sTime.wHour, __sTime.wMinute, __sTime.wSecond, __sTime.wMilliseconds
- , GetCurrentThreadId(), szHead);
- DWORD iLen = str.GetLength();
- DWORD unBytesWritten = 0;
- WriteFile(hLog, str, iLen, &unBytesWritten, NULL);
- int iSeq = 0;
- CString strBin;
- const int BYTES_PER_LINE = 16;
- const int SEQ_LEN = 6;
- char szWkBuf[128], szCharBuf[BYTES_PER_LINE + 1];
- for (unsigned int iIndex = 0; iIndex < nLen; )
- {
- //000001: 12 34 56 78 AB CD EF 12 34 56 78 12 12 12 12 12 ...............
- sprintf(szWkBuf, " %0*d: ", SEQ_LEN, iSeq++);
- strBin = szWkBuf;
- memset(szCharBuf, 0, sizeof(szCharBuf));
- for (unsigned int i = 0; i < BYTES_PER_LINE && iIndex < nLen; ++i)
- {
- sprintf(szWkBuf, "%02X ", pbyData[iIndex]);
- strBin += szWkBuf;
- sprintf(szCharBuf + strlen(szCharBuf), "%c", pbyData[iIndex] < 0x20 ? '.' : pbyData[iIndex]);
- ++iIndex;
- }
- if (iIndex % 16)
- {
- strBin += CString(' ', 3 * (16 - iIndex % 16));
- }
- str.Format("%s; %s\r\n", strBin, szCharBuf);
- iLen = str.GetLength();
- unBytesWritten = 0;
- WriteFile(hLog, str, iLen, &unBytesWritten, NULL);
- }
- str = " ----------------------------------------------------------------------------\r\n\r\n";
- iLen = str.GetLength();
- WriteFile(hLog, str, iLen, &unBytesWritten, NULL);
- if (INVALID_HANDLE_VALUE != hLog)
- {
- CloseHandle(hLog);
- }
- }
- /**
- 采用va_list形式的可变参数打印
- @param nType 纪录类型
- - TRACER_OPE_PROGRESS
- - TRACER_OPE_ERROR
- - TRACER_OPE_EXCEPTION
- - TRACER_OPE_MESSAGE
- @param pszFormat 打印格式
- @param pArgList 可变参数列表指针
- */
- ///@endcond
- //@cond ENG
- /**
- Use va_list to Log information
- @param nType Information type
- - TRACER_OPE_PROGRESS
- - TRACER_OPE_ERROR
- - TRACER_OPE_EXCEPTION
- - TRACER_OPE_MESSAGE
- @param pszFormat Format string
- @param pArgList arguments
- */
- ///@endcond
- void CCLogFile::PrintV(TRACER_TYPE nType, LPCTSTR pszFormat, va_list pArgList)
- {
- CString strFormat;
- switch (nType)
- {
- case TRACER_OPE_PROGRESS:
- strFormat = TRACER_OPE_PROGRESS_STR;
- break;
- case TRACER_OPE_ERROR:
- strFormat = TRACER_OPE_ERROR_STR;
- break;
- case TRACER_OPE_EXCEPTION:
- strFormat = TRACER_OPE_EXCEPTION_STR;
- break;
- case TRACER_OPE_MESSAGE:
- strFormat = TRACER_OPE_MESSAGE_STR;
- break;
- default:
- strFormat = ("$$ UNKONW: ");
- }
- strFormat.Append(pszFormat);
- PrintV(strFormat, pArgList);
- }
- //@cond CHS
- /**
- 采用va_list形式的可变参数打印
- @param pszFormat 打印格式
- @param pArgList 可变参数列表指针
- */
- ///@endcond
- //@cond ENG
- /**
- Use va_list to Log information
- @param pszFormat Format string
- @param pArgList arguments
- */
- ///@endcond
- void CCLogFile::PrintV(LPCTSTR pszFormat, va_list pArgList)
- {
- CString str;
- str.FormatV(pszFormat, pArgList);
- str.Append(("\r\n"));
- //TRACE( str );
- LogFile(str);
- }
- /**
- 生成文件
- @param szData 数据
- */
- ///@endcond
- ///@cond ENG
- ///Log file
- ///@param szData Data need log to file
- ///@endcond
- void CCLogFile::LogFile(LPCTSTR szData)
- {
- SYSTEMTIME __sTime;
- ::GetLocalTime(&__sTime);
- /*
- CString str;
- 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); */
- CString str;
- str.Format("%s", m_szFile);
- CSingleLock lock(&this->m_csLog, TRUE);
- HANDLE hLog = this->CreateLogFile(str);
- if (INVALID_HANDLE_VALUE == hLog)
- {
- return;
- }
- str.Format("%02d:%02d:%02d.%03d | ", __sTime.wHour, __sTime.wMinute, __sTime.wSecond, __sTime.wMilliseconds);
- // str = "";
- DWORD iLen = str.GetLength();
- DWORD unBytesWritten = 0;
- WriteFile(hLog, str, iLen, &unBytesWritten, NULL);
- iLen = (DWORD)_tcslen(szData) * sizeof(TCHAR);
- WriteFile(hLog, szData, iLen, &unBytesWritten, NULL);
- OutputDebugString(szData);
- if (INVALID_HANDLE_VALUE != hLog)
- {
- CloseHandle(hLog);
- }
- }
- /**
- 创建日志文件
- /@param str 文件名
- */
- ///@endcond
- ///@cond ENG
- ///Create log file
- ///@param str File Name
- ///@endcond
- HANDLE CCLogFile::CreateLogFile(const CString& str)
- {
- HANDLE hLog = INVALID_HANDLE_VALUE;
- hLog = CreateFile(str, GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,
- NULL);
- if (INVALID_HANDLE_VALUE == hLog)
- {
- if (CheckFilePath(str))
- {
- hLog = CreateFile(str, GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,
- NULL);
- }
- }
- if (INVALID_HANDLE_VALUE != hLog)
- {
- SetFilePointer(hLog, 0, NULL, FILE_END);
- }
- if (!this->m_bFileNameCommited)
- {
- this->m_bFileNameCommited = true;
- }
- return hLog;
- }
- bool CCLogFile::CheckFilePath(const CString& strPath)
- {
- if (strPath.IsEmpty())
- {
- return false;
- }
- int iPos = strPath.ReverseFind('\\');
- if (iPos < 0)
- {
- iPos = strPath.ReverseFind('/');
- if (iPos < 0)
- {
- return false;
- }
- }
- CString cstrPath = strPath.Left(iPos);
- return TRUE;
- }
- void CUtilityTools::WaitingWithEventLoop(int iWaitTime)
- {
- /* if (a_bWithEventLoop)
- {
- auto* pApp = AfxGetApp();
- if (pApp)
- {
- AMICS::UI::CAMICSAppBase* pBaseApp = dynamic_cast<AMICS::UI::CAMICSAppBase*>(pApp);
- if (pBaseApp)
- {
- pBaseApp->WaitingWithEventLoop(a_nMilliseconds);
- return;
- }
- }
- }*/
- //LogTrace(_T("Waiting %d milliseconds ..."), a_nMilliseconds);
- #pragma warning(disable: 28159)
- DWORD nStart = GetTickCount();
- DWORD nEnd = nStart;
- do
- {
- nEnd = GetTickCount();
- } while (nEnd >= nStart && nEnd <= (nStart + iWaitTime + 1));
- #pragma warning(default: 28159)
- }
|