基于iLog3的实时日志实现

来源:互联网 发布:国外十大网络翻唱歌手 编辑:程序博客网 时间:2024/06/04 19:43

这个封装类是为了不用跟傻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.csdn.net/detail/reloner12/8644479

0 0