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