/*********************** MyTrace.h ************************/ #pragma once #include <afxstr.h> /* 使用前需要定义类并设定类的宏属性SetMacroControl。 */ #define PRINT_LOG_NONE 0x00000000 //不开启 #define PRINT_LOG_ENDL 0x00000001 //开启换行 #define PRINT_LOG_TIME 0x00000011 //开启时间输出 #define PRINT_LOG_TRACE 0x00000101 //开启TRACE输出 #define PRINT_LOG_FILE 0x00001001 //开启文件输出 #define PRINT_IMPORTANT 0x00010001 //开启重要信息输出 #define PRINT_GENERAL 0x00100001 //开启普通信息输出 #define PRINT_WARNNING 0x01000001 //开启警告信息输出 #define PRINT_OTHER 0x10000001 //开启其他信息输出 //不换行 #define _PRINT_LOG_ENDL 0x00000000 //开启输出 #define _PRINT_LOG_TIME 0x00000010 //开启时间输出 #define _PRINT_LOG_TRACE 0x00000100 //开启TRACE输出 #define _PRINT_LOG_FILE 0x00001000 //开启文件输出 #define _PRINT_IMPORTANT 0x00010000 //开启重要信息输出 #define _PRINT_GENERAL 0x00100000 //开启普通信息输出 #define _PRINT_WARNNING 0x01000000 //开启警告信息输出 #define _PRINT_OTHER 0x10000000 //开启其他信息输出 #define IS_PRINT 0x11110000 //检测以上信息是否开启 //组合 #define X_PRINT_IMPORTANT 0x00011111 //输出重要 #define X_PRINT_GENERAL 0x00101111 //输出普通 #define X_PRINT_WARNNING 0x01001111 //输出警告 #define X_PRINT_OTHER 0x10001111 //输出其他 #define X_PRINT1 0x10011111 // #define X_PRINT2 0x10111111 // #define X_PRINT3 0x11111111 // //宏定义编译时不进行类型检测 const int cX_PRINT_IMPORTANT = X_PRINT_IMPORTANT; //输出重要 const int cX_PRINT_GENERAL = X_PRINT_GENERAL; //输出普通 const int cX_PRINT_WARNNING = X_PRINT_WARNNING; //输出警告 const int cX_PRINT_OTHER = X_PRINT_OTHER; //输出其他 #define MAX_COUNT_FILE_OPEN 3 #define OUT_LOG_NAME "run.log" # define OPEN_MYTRACE class MyTrace { public: MyTrace(void); ~MyTrace(void); private: CStringA m_strCurFilePath; //当前程序运行路径 CStringA m_strTraceName; //数据文件名 HANDLE m_hWriteEvent; //控制写信号量 int m_nMacroControl; //宏控制显示 private: CStringA GetAppDirectory(); public: CStringA CombineLineNumAndData(CStringA strData,int nLine); CStringA CombineFunctionNameAndData(CStringA strData,CStringA strFunctionName); void PrintLog(CStringA strData, int nMacroControl); void CleanLog(); void SetMacroControl(int nMacroControl) { m_nMacroControl = nMacroControl;} void PrintImportantLog(CStringA strData) { strData = "[Important]" + strData; PrintLog( strData, cX_PRINT_IMPORTANT);} void PrintGeneralLog(CStringA strData) { strData = "[General]" + strData; PrintLog( strData, cX_PRINT_GENERAL);} void PrintWarnningLog(CStringA strData) { strData = "[Warnning]" + strData; PrintLog( strData, cX_PRINT_WARNNING);} void PrintOtherLog(CStringA strData) { strData = "[Other]" + strData; PrintLog( strData, cX_PRINT_OTHER);} #if 1 void PrintImportantLogAndLine(CStringA strData, int nLine) { strData = CombineLineNumAndData( strData, nLine); PrintImportantLog( strData);} void PrintGeneralLogAndLine(CStringA strData, int nLine) { strData = CombineLineNumAndData( strData, nLine); PrintGeneralLog( strData);} void PrintWarnningLogAndLine(CStringA strData, int nLine) { strData = CombineLineNumAndData( strData, nLine); PrintWarnningLog( strData);} void PrintOtherLogAndLine(CStringA strData, int nLine) { strData = CombineLineNumAndData( strData, nLine); PrintOtherLog( strData);} void PrintImportantLineFuncLog(CStringA strData, int nLine, CStringA strFunc) { strData = CombineFunctionNameAndData( strData, strFunc); PrintImportantLogAndLine( strData, nLine);} void PrintGeneralLineFuncLog(CStringA strData, int nLine, CStringA strFunc) { strData = CombineFunctionNameAndData( strData, strFunc); PrintGeneralLogAndLine( strData, nLine);} void PrintWarnningLineFuncLog(CStringA strData, int nLine, CStringA strFunc) { strData = CombineFunctionNameAndData( strData, strFunc); PrintWarnningLogAndLine( strData, nLine);} void PrintOtherLineFuncLog(CStringA strData, int nLine, CStringA strFunc) { strData = CombineFunctionNameAndData( strData, strFunc); PrintOtherLogAndLine( strData, nLine);} #else void PrintImportantLogAndLine(CStringA strData) { strData = CombineLineNumAndData( strData, __LINE__); PrintImportantLog( strData);} void PrintGeneralLogAndLine(CStringA strData) { strData = CombineLineNumAndData( strData, __LINE__); PrintGeneralLog( strData);} void PrintWarnningLogAndLine(CStringA strData) { strData = CombineLineNumAndData( strData, __LINE__); PrintWarnningLog( strData);} void PrintOtherLogAndLine(CStringA strData) { strData = CombineLineNumAndData( strData, __LINE__); PrintOtherLog( strData);} void PrintImportantLineFuncLog(CStringA strData) { strData = CombineFunctionNameAndData( strData, __FUNCTION__); PrintImportantLogAndLine( strData);} void PrintGeneralLineFuncLog(CStringA strData) { strData = CombineFunctionNameAndData( strData, __FUNCTION__); PrintGeneralLogAndLine( strData);} void PrintWarnningLineFuncLog(CStringA strData) { strData = CombineFunctionNameAndData( strData, __FUNCTION__); PrintWarnningLogAndLine( strData);} void PrintOtherLineFuncLog(CStringA strData) { strData = CombineFunctionNameAndData( strData, __FUNCTION__); PrintOtherLogAndLine( strData);} void PrintImportantLineFuncLog() { CStringA strData = CombineFunctionNameAndData( "", __FUNCTION__); PrintImportantLogAndLine( strData);} void PrintGeneralLineFuncLog() { CStringA strData = CombineFunctionNameAndData( "", __FUNCTION__); PrintGeneralLogAndLine( strData);} void PrintWarnningLineFuncLog() { CStringA strData = CombineFunctionNameAndData( "", __FUNCTION__); PrintWarnningLogAndLine( strData);} void PrintOtherLineFuncLog() { CStringA strData = CombineFunctionNameAndData( "", __FUNCTION__); PrintOtherLogAndLine( strData);} #endif }; /*********************** MyTrace.cpp ************************/ #include "StdAfx.h" #include "MyTrace.h" #include <afx.h> MyTrace::MyTrace(void) { m_strCurFilePath= GetAppDirectory(); m_strTraceName = OUT_LOG_NAME; m_hWriteEvent = CreateEvent(NULL, TRUE, TRUE, NULL); m_nMacroControl = X_PRINT1; if( m_hWriteEvent == NULL ) { } } MyTrace::~MyTrace(void) { if( m_hWriteEvent ) { CloseHandle( m_hWriteEvent ); m_hWriteEvent = NULL; } } /* Func:组合行号与数据 */ CStringA MyTrace::CombineLineNumAndData(CStringA strData,int nLine) { CStringA strBuf; strBuf.Format("Line%d:%s",nLine,strData); return strBuf; } /* Func:函数名与数据 */ CStringA MyTrace::CombineFunctionNameAndData(CStringA strData,CStringA strFunctionName) { strData = strFunctionName + ("\r\n") + strData; return strData; } /* Func:获取当前程序运行路径\结尾 */ CStringA MyTrace::GetAppDirectory() { CStringA strCurFilePath; #ifdef UNICODE TCHAR wszFileName[500] = {0}; TCHAR *pFileName = wszFileName; #else char szFileName[500]={0}; char *pFileName = szFileName; #endif HMODULE hModule = GetModuleHandle(0); GetModuleFileName(hModule, pFileName, 500); CStringA strTemp(pFileName); int nPos = strTemp.ReverseFind(_T('\\') ); if(nPos>=0) { strCurFilePath = strTemp.Left(nPos); strCurFilePath += "\\"; } return strCurFilePath; } /* Func:log输出 */ void MyTrace::PrintLog(CStringA strData,int nMacroControl) { nMacroControl = nMacroControl & m_nMacroControl; if((nMacroControl & IS_PRINT )== PRINT_LOG_NONE) return; if( strData.IsEmpty() ) { return; } if( m_hWriteEvent == NULL ) { return; } CStringA strPrint = strData; strPrint += "\r\n"; //开启Log输出 if(strPrint.GetLength() < 512 &&( PRINT_LOG_TRACE ==( PRINT_LOG_TRACE & nMacroControl))) { TRACE(strPrint); } #if 0 SYSTEMTIME time; GetLocalTime(&time); CStringA strTime; strTime.Format("%d%02d%02d\t%02d:%02d:%02d\t",time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond); strPrint = strTime + strPrint; #endif //等待上一个写事件完成 WaitForSingleObject( m_hWriteEvent, INFINITE ); //重置信号,不允许写文件 ResetEvent( m_hWriteEvent ); //输出数据到文件 if(PRINT_LOG_FILE != (PRINT_LOG_FILE & nMacroControl)) //不输出到文件 return; CFile file; CFileException ex; #ifdef UNICODE CStringA strFilePathA = m_strCurFilePath + m_strTraceName; CString strFilePath(strFilePathA); #else CString strFilePath = m_strCurFilePath + m_strTraceName; #endif int nCount = 0; while( nCount < MAX_COUNT_FILE_OPEN ) { if( !file.Open( strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate, &ex ) ) { TCHAR tch[1024]; memset(tch,'\0',1024); ex.GetErrorMessage(tch,1024); TRACE(tch); TRACE(" Open file failure!!!!!!! \r\n"); } else { file.SeekToEnd(); file.Write(strPrint,strPrint.GetLength()); file.Close(); break; } nCount++; Sleep(1); } //设置信号,允许写文件 SetEvent(m_hWriteEvent); } /* Func:获取当前程序运行路径\结尾 */ void MyTrace::CleanLog() { #ifdef UNICODE CStringA strFilePathA = m_strCurFilePath + m_strTraceName; CString strFilePath(strFilePathA); #else CString strFilePath = m_strCurFilePath + m_strTraceName; #endif CFile file; if( file.Open( (strFilePath), CFile::modeCreate, NULL)) { file.Close(); } else { TRACE(" Open File with create failure!!!!! \r\n"); } }