?? trace.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 + -