DebugTrace.h
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:7k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2. *  Openmysee
  3. *
  4. *  This program is free software; you can redistribute it and/or modify
  5. *  it under the terms of the GNU General Public License as published by
  6. *  the Free Software Foundation; either version 2 of the License, or
  7. *  (at your option) any later version.
  8. *
  9. *  This program is distributed in the hope that it will be useful,
  10. *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. *  GNU General Public License for more details.
  13. *
  14. *  You should have received a copy of the GNU General Public License
  15. *  along with this program; if not, write to the Free Software
  16. *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17. *
  18. */
  19. /*
  20. 对外接口函数说明:
  21. //断言函数.若传入参数不为true则出现断言失败对话框, 并终止程序运行;
  22. //发行版中则什么也不做
  23. //eg:  ASSERT(apStrVal != NULL);
  24. 1、void ASSERT(bool) 
  25. //记录日志 level为日志等级,args为日志内容
  26. //eg:  RecordLog(1,"姓名:" << lszName<<"年龄:"<< 26 << "性别" << true);
  27. //TRACE在发行版中为空函数
  28. 2、void TRACE/RecordLog(level, args) 
  29. //打印调试信息(0-6表示调试信息的级别,0级最高),发行版中什么也不做
  30. //eg:TRACE2("姓名:%s,年龄:%d,性别:%d",lszName,26,true);
  31. 3、TRACE0 - TRACE6
  32. //设置打印日值的级别(静态函数)
  33. 4、 void CDebugTrace::SetTraceLevel(int aiTraceLevel);
  34. //设置日志文件名(静态函数)
  35. 5、 void CDebugTrace::SetLogFileName(char *aszLogFile);
  36. // 设置TRACE选项 .注意函数可以 OR 各选项(静态函数)
  37. 6、 void CDebugTrace::SetTraceOptions(unsigned options);
  38. //取得TRACE选项(静态函数)
  39. 7、 unsigned CDebugTrace::GetTraceOptions(void);
  40. 典型用法:  
  41. CDebugTrace::SetTraceLevel(6); //设置可打印的日志级别
  42.     //设置日志选项
  43. CDebugTrace::SetTraceOptions(CDebugTrace::GetTraceOptions() 
  44. | CDebugTrace::Timestamp | CDebugTrace::LogLevel
  45. & ~CDebugTrace::FileAndLine | CDebugTrace::AppendToFile
  46. | CDebugTrace::PrintToConsole);
  47. //设置日志保存文件名
  48. CDebugTrace::SetLogFileName("d:\test.log");
  49.     TRACE0("姓名:%s,年龄:%d,性别:%d",lszName,26,true);
  50. RecordLog(1,"姓名:" << lszName<<"年龄:"<< 26 << "性别" << true);
  51. ASSERT(apStrVal != NULL);
  52. */
  53. // $_FILEHEADER_END ******************************
  54. #ifndef _DEBUGTRACE_HEAD_
  55. #define _DEBUGTRACE_HEAD_
  56. #ifdef WIN32
  57. #include <windows.h>
  58. #endif
  59. #include "CriticalSection.h"
  60. //#include "TypeDeff.h"
  61. //////////////////////////////////////////////////////////////////////
  62. //有关ASSERT的定义
  63. #undef ASSERT //取消ASSERT宏
  64. //  重新定义ASSERT宏  
  65. #ifdef _DEBUG //测试版
  66. #define ASSERT(f)               
  67. if(f)
  68. ;
  69. else                            
  70. CDebugTrace::AssertFail(#f,__FILE__, __LINE__)
  71. #else //发行版
  72.     #define ASSERT(f)
  73. #endif
  74. //////////////////////////////////////////////////////////////////////
  75. //有关TRACE的定义
  76. //RecordLog是流方式的日志输出
  77. //eg: RecordLog(1,"姓名:" << lszName<<"年龄:"<< 26 << "性别" << true);
  78. #define RecordLog(level, args) 
  79. if (!CDebugTrace::CanTrace(level))  ;  else
  80. CDebugTrace::EndTrace(CDebugTrace::BeginTrace(level,__FILE__,__LINE__) << args << 'n')
  81. //TraceLogX系列是类似printf方式输出,X表示日志级别
  82. //eg:TRACE0("姓名:%s,年龄:%d,性别:%d",lszName,26,true);
  83. #define TraceLog0 
  84. if (!CDebugTrace::CanTrace(0))  ;  else
  85. CDebugTrace::BeginTrace(0,__FILE__,__LINE__).TraceFormat
  86. #define TraceLog1 
  87.     if (!CDebugTrace::CanTrace(1))  ;  else
  88.         CDebugTrace::BeginTrace(1,__FILE__,__LINE__).TraceFormat
  89. #define TraceLog2 
  90.     if (!CDebugTrace::CanTrace(2))  ;  else
  91.         CDebugTrace::BeginTrace(2,__FILE__,__LINE__).TraceFormat
  92. #define TraceLog3 
  93.     if (!CDebugTrace::CanTrace(3))  ;  else
  94.         CDebugTrace::BeginTrace(3,__FILE__,__LINE__).TraceFormat
  95. #define TraceLog4 
  96.     if (!CDebugTrace::CanTrace(4))  ;  else
  97.         CDebugTrace::BeginTrace(4,__FILE__,__LINE__).TraceFormat
  98. #define TraceLog5 
  99.     if (!CDebugTrace::CanTrace(5))  ;  else
  100.         CDebugTrace::BeginTrace(5,__FILE__,__LINE__).TraceFormat
  101. #define TraceLog6 
  102.     if (!CDebugTrace::CanTrace(6))  ;  else
  103.         CDebugTrace::BeginTrace(6,__FILE__,__LINE__).TraceFormat
  104. //取消TRACE定义
  105. #undef TRACE
  106. #undef TRACE0
  107. #undef TRACE1
  108. #undef TRACE2
  109. #undef TRACE3
  110. #undef TRACE4
  111. #undef TRACE5
  112. #undef TRACE6
  113. //重新定义TRACE语句
  114. #ifdef _DEBUG //调试版
  115. #define TRACE RecordLog //打印日志
  116. #define TRACE0 TraceLog0
  117. #define TRACE1 TraceLog1
  118. #define TRACE2 TraceLog2
  119. #define TRACE3 TraceLog3
  120. #define TRACE4 TraceLog4
  121. #define TRACE5 TraceLog5
  122. #define TRACE6 TraceLog6
  123. #else //发行版
  124. #define TRACE(level, args) //TRACE函数为空
  125. #define TRACE0 ;
  126. #define TRACE1 ;
  127. #define TRACE2 ;
  128. #define TRACE3 ;
  129. #define TRACE4 ;
  130. #define TRACE5 ;
  131. #define TRACE6 ;
  132. #endif //_DEBUG
  133. //////////////////////////////////////////////////////////////////
  134. //下面是CDebugTrace类的定义
  135. #define DEF_TRACE_BUFF_LEN 2048
  136. class CDebugTrace
  137. {
  138. private:
  139. long mlDataLen;  //数据长度
  140.     char mszPrintBuff[DEF_TRACE_BUFF_LEN];  //打印数据缓存
  141.     UC::CCriticalSection moCriticalSection;     //临界区
  142. private:
  143.     static int    mnLogLevel;  //日志等级
  144. static char    mszLogFileName[512]; //日志文件名称
  145. static unsigned    muTraceOptions;  //打印日志选项
  146. public:
  147. //打印选项
  148. enum Options 
  149. {
  150. /// 打印时间
  151. Timestamp = 1,
  152. /// 打印日志级别
  153. LogLevel = 2,
  154. /// 打印源文件名和行号
  155. FileAndLine = 4,
  156. /// 把日志追加到文件中
  157. AppendToFile = 8,
  158. ///输出日志到控制台
  159. PrintToConsole = 16
  160. };    
  161. //构造函数
  162. CDebugTrace();
  163. //析够函数
  164. ~CDebugTrace();
  165. public:
  166. //设置日志级别(0级最高,1其次,依次类推,小于该等级的日志不打印)
  167. static void SetTraceLevel(int aiTraceLevel);
  168. //设置日志文件名
  169. static void SetLogFileName(char *aszLogFile);
  170. // 设置TRACE选项 .注意函数可以 OR 各选项
  171. static void SetTraceOptions(unsigned options /** New level for trace */ );
  172. //取得TRACE选项
  173. static unsigned GetTraceOptions(void);
  174. //判断给定级别是否可以打印
  175. static bool CanTrace(int aiLogLevel);
  176. //开始打印
  177. static CDebugTrace& BeginTrace(int aiLogLevel,char *apSrcFile,int aiSrcLine);
  178. //结束打印
  179. static void EndTrace(CDebugTrace &aoDebugTrace);
  180. //断言失败处理函数
  181. static void AssertFail(char * strCond,char *strFile, unsigned uLine);
  182. public:
  183.     //按照函数printf的类似格式打印日志
  184. void TraceFormat(const char * pFmt,...);
  185. //以下分别输出各种数据类型
  186. CDebugTrace& operator << (char acCharVal);
  187. CDebugTrace& operator << (bool abBoolVal);
  188. CDebugTrace& operator << (short asShortVal);
  189. CDebugTrace& operator << (unsigned short asShortVal);
  190. CDebugTrace& operator << (int aiIntVal);
  191. CDebugTrace& operator << (unsigned int aiIntVal);
  192. CDebugTrace& operator << (long alLongVal);
  193. CDebugTrace& operator << (unsigned long alLongVal);
  194. CDebugTrace& operator << (float afFloatVal);
  195. CDebugTrace& operator << (double afdoubleVal);
  196. CDebugTrace& operator << (__int64 aiInt64Val);
  197. CDebugTrace& operator << (const char *apStrVal);
  198. };
  199. #endif//_DEBUGTRACE_HEAD_