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