首页
社区
课程
招聘
[原创]发些个人库之 log 信息输出
发表于: 2013-10-7 12:19 6048

[原创]发些个人库之 log 信息输出

2013-10-7 12:19
6048
鉴于某某心情不佳,发点东西出来,让大家批一下吧,
DebugX.h
/***********************************************************************
版权所有:choday
文件名称:XDebug.h
描    述:
作    者:choday  
创建日期:2011-10-17 17:09:16
修 改 人:choday
修改日期:
修改原因:
***********************************************************************/

#pragma once
#include <tchar.h>
#include <stdio.h>
#include <crtdbg.h>
//#define DEBUG_TO_FILE _T("debug.txt")
//#define DEBUG_TO_CONSOLE
namespace XLIB
{

BOOL	PrintIP( DWORD ip );
BOOL	PrintfSockAddr( const SOCKADDR* paddr );

#ifdef DEBUG_TO_FILE

#define XInitDebug(){_tfreopen( DEBUG_TO_FILE,_T("a+t"),stdout);}
#define XDebugOut fflush(stdout);_tprintf
#define XDebugOutIP XLIB::PrintIP
#define XDebugOutSockAddr XLIB::PrintfSockAddr
#define XCloseDebug() fflush(stdout);

#else

#ifdef DEBUG_TO_CONSOLE
#define XInitDebug() {AllocConsole();freopen("CONOUT$","w+t",stdout);freopen("CONIN$","r+t",stdin);}
#define XDebugOut _tprintf
#define XDebugOutIP XLIB::PrintIP
#define XDebugOutSockAddr XLIB::PrintfSockAddr
#define XCloseDebug FreeConsole
#endif

#endif

#ifndef XInitDebug 
#define XInitDebug() ;
#define XDebugOutIP(a) ;
#define XDebugOutSockAddr(a) ;
#define XDebugOut ;
#define XCloseDebug() ;
#endif


class CXMessageLog
{
public:
	typedef enum
	{
		MESSAGE_TO_CONSOLE,
		MESSAGE_TO_FILE,
		MESSAGE_TO_DEBUGER,

	}MESSAGE_TO;

	CXMessageLog( MESSAGE_TO to,BOOL AddTime = FALSE,LPCTSTR lpFile = 0);
	CXMessageLog();
	~CXMessageLog();

	BOOL	Init( MESSAGE_TO to,BOOL AddTime = FALSE,LPCTSTR lpFile = 0);
	VOID	UnInit();

	VOID _cdecl MessageOut( LPCTSTR lpformat,... );
private:
	MESSAGE_TO	m_Messageto;
	TCHAR		m_lpFileName[MAX_PATH];
	BOOL		m_bInited;
	BOOL		m_AddTime;
};


/////////////////////////////////////////////////////////////////////////////////////
//
#ifndef ASSERT
	#ifdef _DEBUG
		#define ASSERT(expr)  _ASSERTE(expr)
	#else
		#define ASSERT(expr)
	#endif
#endif

#ifdef _DEBUG
#ifndef TRACE
#define TRACE __Trace
#endif
#else
#ifndef TRACE
#define TRACE
#endif
#endif

void X__Trace(LPCTSTR pstrFormat, ...);


/////////////////////////////////////////////////////////////////////////////////////
}


DebugX.cpp

/***********************************************************************
版权所有:choday
文件名称:XDebug.cpp
描    述:
作    者:choday  
创建日期:2011-10-17 17:03:37
修 改 人:choday
修改日期:
修改原因:
***********************************************************************/

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <tchar.h>
#include "Debugx.h"
namespace XLIB
{

CXMessageLog::CXMessageLog()
{
	m_bInited = FALSE;
	m_AddTime = FALSE;
	ZeroMemory( m_lpFileName,sizeof(m_lpFileName) );
}

CXMessageLog::~CXMessageLog()
{
	UnInit();
}

CXMessageLog::CXMessageLog(MESSAGE_TO to,BOOL AddTime,LPCTSTR lpFile )
{
	ZeroMemory( m_lpFileName,sizeof(m_lpFileName) );
	Init( to,AddTime,lpFile );
}

BOOL CXMessageLog::Init(MESSAGE_TO to,BOOL AddTime,LPCTSTR lpFile )
{
	m_Messageto = to;
	lstrcpy( m_lpFileName,lpFile );
	m_AddTime	 = AddTime;

	if( MESSAGE_TO_FILE == to)
	{
		_tfreopen( lpFile,_T("a+t"),stdout);
	}

	if( MESSAGE_TO_CONSOLE == to )
	{
		AllocConsole();
		freopen("CONOUT$","w+t",stdout);
		//freopen("CONIN$","r+t",stdin);
	}

	m_bInited = TRUE;
	return TRUE;
}

VOID CXMessageLog::UnInit()
{
	if( MESSAGE_TO_CONSOLE == m_Messageto)FreeConsole();

}


VOID _cdecl CXMessageLog::MessageOut( LPCTSTR lpformat,... )
{
	va_list args;
	int n;
	TCHAR	sprint_buf[1024];
	TCHAR	strTime[40] = {0};
	SYSTEMTIME	system = {0};

	if( FALSE == m_bInited )return;



	va_start(args, lpformat);
	n = _vstprintf(sprint_buf, lpformat, args);
	va_end(args);

	switch( m_Messageto )
	{
	case MESSAGE_TO_FILE:
	case MESSAGE_TO_CONSOLE:
		if( m_AddTime )
		{
			GetLocalTime( &system );
			wsprintf( strTime,_T("%04d-%02d-%02d %02d:%02d:%02d.%03d\t"),system.wYear,system.wMonth,system.wDay,
																system.wHour,system.wMinute,system.wSecond,system.wMilliseconds );

			_tprintf( strTime );
		}

		_tprintf( sprint_buf );
		fflush(stdout);
		break;
	case MESSAGE_TO_DEBUGER:
		OutputDebugString(sprint_buf);
		break;
	}

}

void X__Trace(LPCTSTR pstrFormat, ...)
{
#ifdef _DEBUG
    TCHAR szBuffer[300] = { 0 };
    va_list args;
    va_start(args, pstrFormat);
    _vstprintf(szBuffer, pstrFormat, args);
    va_end(args);
    ::OutputDebugString(szBuffer);
#endif
}


BOOL	PrintIP( DWORD ip )
{
	LPBYTE	lpIP = (LPBYTE)&ip;
	_tprintf( _T("%d.%d.%d.%d"),lpIP[0],lpIP[1],lpIP[2],lpIP[3]);
	return TRUE;
}

BOOL	PrintfSockAddr( const SOCKADDR* p )
{
	sockaddr_in* paddr=(sockaddr_in*)p;

	_tprintf( _T("%d.%d.%d.%d:%d"),paddr->sin_addr.S_un.S_un_b.s_b1,
										paddr->sin_addr.S_un.S_un_b.s_b2,
										paddr->sin_addr.S_un.S_un_b.s_b3,
										paddr->sin_addr.S_un.S_un_b.s_b4,
										htons(paddr->sin_port) );
	return TRUE;
}

}


依懒winsock2.h

用法
#define DEBUG_TO_FILE _T("debug.txt") //输出到文件,不定义的话,关闭输出
#include "Debugx.h"

或者

#define DEBUG_TO_CONSOLE 输出到命令行
#include "Debugx.h"

程序入口处调用
XInitDebug() 创建命令行,或者...

输出格式化信息
XDebugOut( _T("id=%d\n"),1 );

输出 sockaddr
sockaddr addr;
XDebugOutSockAddr(&addr);

输出ipv4
DWORD ipv4

XDebugOutIP(ipv4);//ipv6自己搞

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
最新回复 (6)
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
很实用的代码
2013-10-7 12:43
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
3
学习学习,还是比较崇尚glog,一直在学习google的框架,顶一个,希望有天自己能写出与google相媲美的代码。
2013-10-7 12:50
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
glog太复杂了,咋用些简单的东西
2013-10-7 12:52
0
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
希望大家多分享一下这样的东西,并把用法写清楚,方便新手,邓涛的就没写清楚,还是楼主的好
2013-10-7 13:28
0
雪    币: 357
活跃值: (3123)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
6
PrintfSockAddr 我喜欢用 inet_ntoa 代替
2013-10-7 14:06
0
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
7
google说了,调试信息输出允许用流,流使得信息输出更加方便简捷。
类如:
xerr << "int:" << value << "  lp:" << (void*)lp;
xdbg << "xdbg";
xtrace << "xtrace";
求超越
2013-10-8 10:46
0
游客
登录 | 注册 方可回帖
返回
//