⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trace.cpp

📁 自己写的是用于所有VC开发平台和linux平台软件开发的trace功能函数。可自定module,evel, 系统时间开关
💻 CPP
字号:
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdarg.h>

#include "trace.h"

#define MAX_TRACESTR  2048

#ifdef _WIN32 
	#if (_MSC_VER < 1500)
		#define vsnprintf _vsnprintf
	#endif 
#endif

unsigned long DEBUG_FLAGS = TRACE_LEVEL_ERROR_OPEN    |
							TRACE_LEVEL_RETURN_OPEN   |
                            TRACE_LEVEL_INFO_OPEN     |
							TRACE_LEVEL_PARAM_OPEN    |
                            TRACE_LEVEL_ENTER_OPEN    |
                            TRACE_LEVEL_DEBUG_OPEN[0] |
                            TRACE_LEVEL_DEBUG_OPEN[1] |
							TRACE_LEVEL_DEBUG_OPEN[2] |
							TRACE_LEVEL_DEBUG_OPEN[3] |
							TRACE_LEVEL_DEBUG_OPEN[4] |
							TRACE_LEVEL_DEBUG_OPEN[5] |
							TRACE_LEVEL_DEBUG_OPEN[6] |
							TRACE_LEVEL_DEBUG_OPEN[7] |
							TRACE_LEVEL_DEBUG_OPEN[8] ;
/*
unsigned long TRACE_TO_FILE_MODE = TRACE_TO_FILE_ENTER_OPEN   |
								   TRACE_TO_FILE_RETURN_OPEN  |
								   TRACE_TO_FILE_PARAM_OPEN   |
								   TRACE_TO_FILE_INFO_OPEN	  |
								   TRACE_TO_FILE_ERROR_OPEN   |
								   TRACE_TO_FILE_DEBUG_OPEN[0]|
								   TRACE_TO_FILE_DEBUG_OPEN[1]|
								   TRACE_TO_FILE_DEBUG_OPEN[2]|
								   TRACE_TO_FILE_DEBUG_OPEN[3]|
								   TRACE_TO_FILE_DEBUG_OPEN[4]|
								   TRACE_TO_FILE_DEBUG_OPEN[5]|
								   TRACE_TO_FILE_DEBUG_OPEN[6]|
								   TRACE_TO_FILE_DEBUG_OPEN[7]|
								   TRACE_TO_FILE_DEBUG_OPEN[8];
*/
unsigned long TRACE_TO_FILE_MODE = 0;

unsigned long SYSTEM_TIME_ON = 0;

static int fileCounter = 1;
static char logFileName[12] = "";
static char traceHeaderStr[64] = "";

static char* funcName = NULL;
static char* fileName = NULL;
static int lineNumber = -1;
/*---------------------------------------------------------------------------------*/
/**
 * setTraceLevel
 * The function configurates the trace levels which to be used
 *
 * @param traceLevelFlags   specifies the trace levels
 * @return                  none
 */
void setTraceLevel(unsigned long traceLevelFlags)
{
	DEBUG_FLAGS = traceLevelFlags;
	return;
}

/*---------------------------------------------------------------------------------*/
/**
 * setTraceOutputMode
 * The function configurates which trace level's trace log to be store into file
 *
 * @param traceOutputMode   specifies the trace level flags
 * @return                  none
 */
void setTraceOutputMode(unsigned long traceOutputMode)
{
	TRACE_TO_FILE_MODE = traceOutputMode;
	return;
}

void setSystemTimeOn(unsigned long isSystemTimeOn)
{
	SYSTEM_TIME_ON = isSystemTimeOn;
	return;
}

/*---------------------------------------------------------------------------------*/
/**
 * setTraceLevelAndOutputMode
 * The function configurates trace related options
 *
 * @param traceOutputMode   specifies the trace level flags
 * @param traceLevelFlags   specifies the trace levels
 * @param isSystemTimeOn    whether open timer record in the trace. Open:1 Close:0
 * @return                  none
 */
void initTraceCfg(unsigned long traceOutputMode,unsigned long traceLevelFlags,unsigned long isSystemTimeOn)
{
	setTraceLevel(traceLevelFlags);
	setTraceOutputMode(traceOutputMode);
    setSystemTimeOn(isSystemTimeOn);
	return;
}

/*---------------------------------------------------------------------------------*/
/**
 * getSysTime
 * The function gets the current system time.
 *
 * @param systemTimeBuffer  the buffer is used to store the system time
 * @return                  none
 */
void getSysTime(char systemTimeBuffer[MAX_SYSTEM_TIME_BUF_LENGTH])
{
	struct tm *newtime;
    char am_pm[] = "AM";
	time_t now;
    time(&now);                       
	// Convert to local time.											 
    newtime = localtime(&now);
    if(newtime->tm_hour > 12)        
	strcpy(am_pm,"PM");
	// Convert from 24-hour to 12-hour clock.
	if(newtime->tm_hour > 12)        
	newtime->tm_hour -= 12;
	// Set hour to 12 if midnight.
	if(newtime->tm_hour == 0)       
	newtime->tm_hour = 12;
	sprintf(systemTimeBuffer,"%.19s %s", asctime(newtime), am_pm);
	return;
}

/*---------------------------------------------------------------------------------*/
/**
 * LogOutput
 * The function output the trace log into a file named Trace.log.
 *
 * @param logStr  the string pointer is used to store the system time
 * @return                  none
 */
void LogOutput(char* logStr)
{
	FILE *pFile;
	unsigned long nFileLen = 0;
	
	sprintf(logFileName,"Trace%d.log",fileCounter);

	pFile = fopen (logFileName,"a+");
	fseek(pFile,0,SEEK_END);  
	nFileLen = ftell(pFile);
	if(10000 <= nFileLen)
	{
		fileCounter++;
		fclose(pFile);
		sprintf(logFileName,"Trace%d.log",fileCounter);
		pFile = fopen (logFileName,"a+");
	}
	fputs ((const char*)logStr,pFile);
    fclose(pFile);
}

char* getFuncName(char name[])
{
	funcName = name;
	return funcName;
}

int getLineNumber(int line)
{
	lineNumber = line;
	return lineNumber;
}

char* getFileName(char name[])
{
	char* tmpStr = name;
	int flag = 1;

	while(NULL != strchr(tmpStr,'\\'))
	{
		tmpStr = strchr(tmpStr,'\\');
		tmpStr++;
	}

	while(NULL != strchr(tmpStr,'/'))
	{
		tmpStr = strchr(tmpStr,'/');
		tmpStr++;
	}

	fileName = tmpStr;

	return fileName;
}

bool _Enter(const char*format,...)
{
  char systemTimeBuffer[MAX_SYSTEM_TIME_BUF_LENGTH] = ""; 
  char logStr[MAX_LOG_STR_LENGTH] = "";

  char str[MAX_TRACESTR];
  va_list ap;

  va_start(ap, format);
  
  if (DEBUG_FLAGS)
  {
    vsnprintf(str, MAX_TRACESTR, format, ap);
  }
  else
  {
    *str = '\x0';
  }
  va_end(ap);

  if (DEBUG_FLAGS & TRACE_LEVEL_ENTER_OPEN)
  {
      if(SYSTEM_TIME_ON)
	  {
		 getSysTime(systemTimeBuffer);
		 sprintf(traceHeaderStr,"[%s]::",systemTimeBuffer);
	  }
      else
	  {
		//memset(traceHeaderStr,0,sizeof(traceHeaderStr));
		  traceHeaderStr[0]='\0';
	  }
	  printf("%s%s::%s@%d::ENTER:%s\n", traceHeaderStr,fileName,funcName,lineNumber,str);
	  if (TRACE_TO_FILE_MODE & TRACE_TO_FILE_ENTER_OPEN)
	  {
		  sprintf(logStr,"%s%s::%s@%d::ENTER:%s\n", traceHeaderStr,fileName,funcName,lineNumber,str);
		LogOutput(logStr);		
	  }
	  return true;
  }
  
  return false;
}

bool _Return(const char*format,...)
{
  char systemTimeBuffer[MAX_SYSTEM_TIME_BUF_LENGTH] = ""; 
  char logStr[MAX_LOG_STR_LENGTH] = "";

  char str[MAX_TRACESTR];
  va_list ap;

  va_start(ap, format);
  
  if (DEBUG_FLAGS)
  {
    vsnprintf(str, MAX_TRACESTR, format, ap);
  }
  else
  {
    *str = '\x0';
  }
  va_end(ap);

  if (DEBUG_FLAGS & TRACE_LEVEL_RETURN_OPEN)
  {
	  if(SYSTEM_TIME_ON)
	  {
		 getSysTime(systemTimeBuffer);
		 sprintf(traceHeaderStr,"[%s]::",systemTimeBuffer);
	  }
      else
	  {
		//memset(traceHeaderStr,0,sizeof(traceHeaderStr));	
	      traceHeaderStr[0]='\0';
	  }
	  printf("%s%s::%s@%d::RETURN:%s\n",traceHeaderStr,fileName,funcName,lineNumber,str);
	  if (TRACE_TO_FILE_MODE & TRACE_TO_FILE_RETURN_OPEN)
	  {
		  sprintf(logStr,"%s%s::%s@%d::RETURN:%s\n",traceHeaderStr,fileName,funcName,lineNumber,str);
		  LogOutput(logStr);
	  }
	  return true;
  }
  return false;
}

bool _Param(const char*format,...)
{
  char systemTimeBuffer[MAX_SYSTEM_TIME_BUF_LENGTH] = ""; 
  char logStr[MAX_LOG_STR_LENGTH] = "";

  char str[MAX_TRACESTR];
  va_list ap;

  va_start(ap, format);
  
  if (DEBUG_FLAGS)
  {
    vsnprintf(str, MAX_TRACESTR, format, ap);
  }
  else
  {
    *str = '\x0';
  }
  va_end(ap);

  if (DEBUG_FLAGS & TRACE_LEVEL_PARAM_OPEN)
  {
	  if(SYSTEM_TIME_ON)
	  {
		 getSysTime(systemTimeBuffer);
		 sprintf(traceHeaderStr,"[%s]::",systemTimeBuffer);
	  }
      else
	  {
		//memset(traceHeaderStr,0,sizeof(traceHeaderStr));
		  traceHeaderStr[0]='\0';
	  }
	  printf("%s%s::%s@%d::PARAM:%s\n",traceHeaderStr,fileName,funcName,lineNumber,str);
	  if (TRACE_TO_FILE_MODE & TRACE_TO_FILE_PARAM_OPEN)
	  {
		  sprintf(logStr,"%s%s::%s@%d::PARAM:%s\n",traceHeaderStr,fileName,funcName,lineNumber,str);
		  LogOutput(logStr);
	  }
	  return true;
  }
  
  return false;
}

bool _Info(const char*format,...)
{
  char systemTimeBuffer[MAX_SYSTEM_TIME_BUF_LENGTH] = ""; 
  char logStr[MAX_LOG_STR_LENGTH] = "";

  char str[MAX_TRACESTR];
  va_list ap;

  va_start(ap, format);
  
  if (DEBUG_FLAGS)
  {
    vsnprintf(str, MAX_TRACESTR, format, ap);
  }
  else
  {
    *str = '\x0';
  }
  va_end(ap);

  if (DEBUG_FLAGS & TRACE_LEVEL_INFO_OPEN)
  {
	  if(SYSTEM_TIME_ON)
	  {
		 getSysTime(systemTimeBuffer);
		 sprintf(traceHeaderStr,"[%s]::",systemTimeBuffer);
	  }
      else
	  {
		//memset(traceHeaderStr,0,sizeof(traceHeaderStr));	
		  traceHeaderStr[0]='\0';
	  }
	  printf("%s%s::%s@%d::INFO:%s\n",traceHeaderStr,fileName,funcName,lineNumber,str);
	  if (TRACE_TO_FILE_MODE & TRACE_TO_FILE_INFO_OPEN)
	  {
		  sprintf(logStr,"%s%s::%s@%d::INFO:%s\n",traceHeaderStr,fileName,funcName,lineNumber,str);
		  LogOutput(logStr);
	  }
	  return true;
  }
  
  return false;
}

bool _Debug(int level,const char* format,...)
{
  char systemTimeBuffer[MAX_SYSTEM_TIME_BUF_LENGTH] = ""; 
  char logStr[MAX_LOG_STR_LENGTH] = "";

  char str[MAX_TRACESTR];
  va_list ap;

  va_start(ap, format);
  
  if (DEBUG_FLAGS)
  {
    vsnprintf(str, MAX_TRACESTR, format, ap);
  }
  else
  {
    *str = '\x0';
  }
  va_end(ap);

  if (level < 1 || level > 9)
      return false;

  if (DEBUG_FLAGS & TRACE_LEVEL_DEBUG_OPEN[level-1])
  {
	  if(SYSTEM_TIME_ON)
	  {
		 getSysTime(systemTimeBuffer);
		 sprintf(traceHeaderStr,"[%s]::",systemTimeBuffer);
	  }
      else
	  {
		//memset(traceHeaderStr,0,sizeof(traceHeaderStr));
		  traceHeaderStr[0]='\0';
	  }
	  printf("%s%s::%s@%d::DEBUG %d:%s\n",traceHeaderStr,fileName,funcName,lineNumber,level,str);
	  if (TRACE_TO_FILE_MODE & TRACE_TO_FILE_DEBUG_OPEN[level-1])
	  {
		  sprintf(logStr,"%s%s::%s@%d::DEBUG %d:%s\n",traceHeaderStr,fileName,funcName,lineNumber,level,str);
		  LogOutput(logStr);
	  }

	  return true;
  }

  return false;
}

bool _Error(const char*format,...)
{
  char systemTimeBuffer[MAX_SYSTEM_TIME_BUF_LENGTH] = ""; 
  char logStr[MAX_LOG_STR_LENGTH] = "";

  char str[MAX_TRACESTR];
  va_list ap;

  va_start(ap, format);
  
  if (DEBUG_FLAGS)
  {
    vsnprintf(str, MAX_TRACESTR, format, ap);
  }
  else
  {
    *str = '\x0';
  }
  va_end(ap);

  if (DEBUG_FLAGS & TRACE_LEVEL_ERROR_OPEN)
  {
	  if(SYSTEM_TIME_ON)
	  {
		 getSysTime(systemTimeBuffer);
		 sprintf(traceHeaderStr,"[%s]::",systemTimeBuffer);
	  }
      else
	  {
		//memset(traceHeaderStr,0,sizeof(traceHeaderStr));
		  traceHeaderStr[0]='\0';
	  }
	  printf("%s%s::%s@%d::ERROR:%s\n",traceHeaderStr,fileName,funcName,lineNumber,str);
	  if (TRACE_TO_FILE_MODE & TRACE_TO_FILE_ERROR_OPEN)
	  {
		  sprintf(logStr,"%s%s::%s@%d::ERROR:%s\n",traceHeaderStr,fileName,funcName,lineNumber,str);
		  LogOutput(logStr);
	  }
	  return true;
  }
  
  return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -