outputdebugstring函数的封装

使用debugview分析问题时,outputdebugstring函数可以在debug和release版本中都显示信息,这比trace更加实用,但前提是你必须将它的参数形式修改成和trace或printf函数一样,下面给出简单修改后的函数形式,并利用宏定义实现日志输出:

int  DebugPrintf(LPCTSTR ptzFormat, ...)
{
	va_list vlArgs;
	TCHAR tzText[1024];
	va_start(vlArgs, ptzFormat);
	//返回-1说明缓存不够 使用下面方式获取实际所需长度
	//int iRealSize= _vsntprintf(NULL,0, ptzFormat, vlArgs);
	int iRet= _vsntprintf(tzText,1024, ptzFormat, vlArgs);
	if (iRet<0)
	{
		tzText[1023] = '\0';
	}
	OutputDebugString(tzText); 
	va_end(vlArgs);
	return iRet;
}

#define LOG_PRINTF DebugPrintf

#define  CONSTSTR_DEBUG		"[DEBUG] "
#define  CONSTSTR_INFO		"[INFO] "
#define  CONSTSTR_WARNING	"[WARNING] "
#define  CONSTSTR_ERROR		"[ERROR] "


#define  LOGLEVEL_DEBUG		1
#define  LOGLEVEL_INFO		2
#define  LOGLEVEL_WARN		3
#define  LOGLEVEL_ERROR		4



int AppLogLevel()
{
	static int iLogLevel =-1;
	if(iLogLevel<0){
	 iLogLevel = GetPrivateProfileInt(_T("log"),_T("level"),0, _T("log_config.ini"));
	}
	 return iLogLevel;
}


#define  APPLOG_DEBUG(s,...) { if(AppLogLevel()<=LOGLEVEL_DEBUG){    LOG_PRINTF(CONSTSTR_DEBUG  s "\r\n", ##__VA_ARGS__);    }    }
#define  APPLOG_INFO(s,...)  { if(AppLogLevel()<=LOGLEVEL_INFO) {    LOG_PRINTF(CONSTSTR_DEBUG  s "\r\n", ##__VA_ARGS__);    }    }
#define  APPLOG_WARN(s,...)  { if(AppLogLevel()<=LOGLEVEL_WARN) {    LOG_PRINTF(CONSTSTR_DEBUG " FILE: " __FILE__ " LINE:%d," s "\r\n",__LINE__, ##__VA_ARGS__);    }    }
#define  APPLOG_ERROR(s,...) { if(AppLogLevel()<=LOGLEVEL_ERROR){    LOG_PRINTF(CONSTSTR_DEBUG " FILE: " __FILE__ " LINE:%d," s "\r\n",__LINE__, ##__VA_ARGS__);    }    }



#define MOUDULE_LOG_DEBUG(s,...)  APPLOG_DEBUG("[MOUDLE_LOGTEST] " s ,##__VA_ARGS__);

int _tmain(int argc, _TCHAR* argv[])
{
	APPLOG_DEBUG("my name is %s ","handsome boy");
	MOUDULE_LOG_DEBUG("my name is %s ","handsome boy");
	APPLOG_ERROR("my name is %s ","handsome boy");

	return 0;
}
  

呵呵,不保证没bug噢

你可能感兴趣的:(C/C++,Windows)