这个封装类是为了不用跟傻X扯逼而创造的.......
首先下载个iLog3,好吧,重点不是日志类,喜欢的话,其他日志类也可以,原理是生成一个console窗口,然后把日志信息输出到console里面,这样做的好处在于在非DEBUG情况下可以实时观察到控件的执行情况,尤其在插件开发中,不用跟java那边扯逼
vs2010+unicode
CLog.h
#pragma once
//
/*这是通过iLOG3项目(http://www.oschina.net/p/iLOG3)封装的日志类
这个日志支持多线程,你看一通过这个日志类调试程序,记录异常
在使用日志的时候请尽量使用宏,方便修改维护
NowLogString :在即时日志窗口显示信息,但是不会记录到日志内
注意:
如果你不需要即时日志窗口可以在初始化Init时设置参数为false
150108:添加了NowLogStringEx,你可以像CString中Fromat那样去直接调用这个宏来拼接字符串
*/
//
#include <stdio.h>
#include "ilog3/LOG.h"
#include "ilog3/LOGCONF.h"
#include "ilog3/LOGS.h"
#include "ilog3/LOGSCONF.h"
#include <atlstr.h>
#include <string>
inline SYSTEMTIME getDt()
{
SYSTEMTIME sys;
GetLocalTime( &sys );
return sys;
}
#define LOG_STYLES_HELLO (LOG_STYLE_FORMAT | LOG_STYLE_NEWLINE)
#define NowLogString(str) m_LogModule?m_LogModule->WriteBeginNowLog(str):getDt();//WriteNowLogString
#define NowLogStringEx(strf,...) {CString str;str.Format(strf,__VA_ARGS__);NowLogString(str);}
#define NowLogShow {m_LogModule?m_LogModule->ShowNowLogConsole():;}
#define NowLogHide {m_LogModule?m_LogModule->HideNowLogConsole():;}
class CLog
{
public:
CLog(void);
~CLog(void);
int Init(bool bNowLog = true);
int InitLog();
SYSTEMTIME WriteBeginNowLog(CString strMsg);
void WriteNowLogString(CString strMsg,bool addtime = true);
void HideNowLogConsole();
void ShowNowLogConsole();
public:
bool bInit;
LOG*gNow;
CStringW strExePath;
HANDLE hConsole;
bool m_bNowLog;
};
extern CLog*m_LogModule;
Clog.cpp
#include "CLog.h"
#pragma comment(lib, "iLOG3.lib")
SYSTEMTIME m_stDate;
CLog*m_LogModule = NULL;
CLog::CLog(void)
{
gNow = NULL;
strExePath = _T("C://log//");//GetMainPathW();
bInit = false;
m_bNowLog = false;
}
CLog::~CLog(void)
{
if(!bInit)
return;
if(gNow!=NULL)
{
DestroyLogHandle(gNow);
gNow=NULL;
}
if(m_bNowLog)
{
if(hConsole!=NULL)
{
CloseHandle(hConsole);
FreeConsole();
}
}
}
int CLog::Init(bool bNowLog)
{
if(bInit)return 1;
if( bNowLog )
{
ShowNowLogConsole();
}
if(InitLog() == 1)
{
bInit = true;
return 1;
}
return -1;
}
int CLog::InitLog()
{
gNow = CreateLogHandle() ;
if( gNow == NULL )
{
if(::MessageBox (NULL,_T("创建日志失败"), _T ("提示"), MB_OK) == IDOK)
{
return -1;
}
return -1;
}
SYSTEMTIME st;
GetLocalTime(&st);
GetLocalTime(&m_stDate);
CString strFileName;
strFileName.Format(_T("%susr\\%d.%d.%d_%d.%d.%d.net.log"),strExePath,st.wYear,st.wMonth,st.wDay,st.wHour,st.wSecond,st.wMilliseconds);
strFileName.Replace(_T("/"),_T("\\"));
CString strDir = strFileName.Mid(0,strFileName.ReverseFind('\\'));
CreateDirectory(strDir,NULL);
#if !Ban_CleanLog_test
::DeleteFile(strFileName);
#endif
std::string g_id = CStringA(strFileName);
SetLogOutput( gNow , LOG_OUTPUT_FILE , (char*)g_id.c_str() , LOG_NO_OUTPUTFUNC );
SetLogLevel ( gNow , LOG_LEVEL_INFO );
SetLogStyles( gNow , LOG_STYLES_HELLO , LOG_NO_STYLEFUNC );
if( gNow == NULL )
{
CString strMsg;
strMsg.Format(_T("创建日志失败"));
if(MessageBox (NULL,strMsg, _T ("提示"), MB_OK) == IDOK)
{
return -1;
}
return -1;
}
return 1;
}
SYSTEMTIME CLog::WriteBeginNowLog(CString strMsg)
{
SYSTEMTIME sys;
GetLocalTime( &sys );
if (gNow == NULL)
return sys;
CString strDt;
strDt.Format(_T("%02d:%02d:%02d.%03d") ,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds);
strMsg = strDt + _T(" | ") + strMsg;
strMsg.Replace(_T("%"),_T("_"));
strMsg.Replace(_T(" "),_T(""));
WriteNowLogString(strMsg,false);
strMsg = _T("{Begin}:")+strMsg;
std::string lpszContent = CStringA(strMsg);
InfoLog(gNow,__FILE__ , __LINE__ ,(char*)lpszContent.c_str());
return sys;
}
void CLog::WriteNowLogString(CString strMsg,bool addtime)
{
if(m_bNowLog)
{
if(addtime)
{
SYSTEMTIME sys;
GetLocalTime( &sys );
CString strDt;
strDt.Format(_T("%02d:%02d:%02d.%03d")
,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds);
strMsg = strDt + _T(" | ") + strMsg;
}
strMsg += _T("\n\r");
WriteConsole(hConsole,strMsg, strMsg.GetLength(), NULL, NULL); //在屏幕显示
}
}
void CLog::HideNowLogConsole()
{
if(m_bNowLog)
{
m_bNowLog = false;
if(hConsole!=NULL)
{
CloseHandle(hConsole);
FreeConsole();
}
}
}
void CLog::ShowNowLogConsole()
{
if( !m_bNowLog )
{
m_bNowLog = true;
AllocConsole();
SetConsoleTitle(_T("NowLog For Web")); //修改Console的标题
hConsole = CreateConsoleScreenBuffer(
GENERIC_READ | GENERIC_WRITE, //权限
FILE_SHARE_READ | FILE_SHARE_WRITE, //console的共享方式
NULL,//安全性设置,NULL默认即可
CONSOLE_TEXTMODE_BUFFER,//唯一值
NULL//保留
);//创建console的屏幕内容缓存,一个进程可以有多个ScreenBuffer
SetConsoleActiveScreenBuffer(hConsole); //显示该buffer的内容
COORD size = {80, 120};
SetConsoleScreenBufferSize(hConsole,size); // 重新设置缓冲区大小
SMALL_RECT rc = {0,0, 80-1, 120-1}; // 重置窗口位置和大小
SetConsoleWindowInfo(hConsole,true ,&rc);
}
}
使用时
#include "CLog.h"
........//other
int main()
{
m_LogModule = new CLog();
CString strI = _T("I");
NowLogStringEx(_T(" %s Fu*k java"),strI);
}
使用实例:http://download.youkuaiyun.com/detail/reloner12/8644479