zoukankan      html  css  js  c++  java
  • 一个支持中文的日志类

    在网上看到了这个类,稍微做了修改,支持中文日志,并且重新排版,添加了部分函数,感谢原作者的分享。

    #pragma once
    #include <afxdlgs.h>        //打开文件
    #include <ShlObj.h>         //浏览文件夹
    #include <string>            //std::string
    
    class CLOG
    {
    public:
        CLOG();
        virtual ~CLOG();
    
    public:
        //-日志文件-
    
        //----如果没有指定,则为exe所在路径下的log.log文件----
        static CString  GetLogFile();
        static short  SetLogFile(LPCTSTR strPath);
        static short  ViewLogFile();
    
        //-前缀-
        //----如果多个进程往同一个文件输出日志,可以为每个进程设置一个前缀----
        //----前缀出现在日期时间之前----
        static short  SetPrefix(LPCTSTR strPrefix);
    
        //-日志信息-
    
        //-获取日志字符串,可以另外-
        static CString  sOutV(LPCTSTR strType, LPCTSTR strFormat = NULL, va_list valist = NULL);
        static CString  sOut0(LPCTSTR strType, LPCTSTR strFormat = NULL,...);
        static CString  sOut ( LPCTSTR strFormat = NULL,...);
    
        //-将日志信息输出到文件-
        static short  OutV(LPCTSTR strType, LPCTSTR strFormat = NULL, va_list valist = NULL);
        static short  Out0(LPCTSTR strType, LPCTSTR strFormat = NULL,...);
        static short  Out(const char* pInfo);
        static short  Out(LPCTSTR strFormat = NULL, ...);
    
    protected:
        static CString  s_strLogFile;
        static CString  s_strLogPrefix;
        static HANDLE  s_hWriteEvent;
    };

    然后是cpp文件

    #include "Log.h"
    // 得到可执行程序所在目录
    
    //  BOOL bIncludeSep -- 是否包含最后的分隔符""
    CString GetExePath(BOOL bIncludeSep)
    {
        // 得到当前的文件名
        CString strFileName;
        GetModuleFileName(AfxGetInstanceHandle(),strFileName.GetBuffer(_MAX_PATH),_MAX_PATH);
        strFileName.ReleaseBuffer();
        // 得到当前目录
        strFileName=strFileName.Left(strFileName.ReverseFind(_T('\'))+1);
        if(bIncludeSep)
            return strFileName;
        else
            return strFileName.Left(strFileName.GetLength()-1);
    }
    
    //-获取最后的文件名 如果给定文件不是全路径,就是相对于exe-
    CString GetFileForExePath(LPCTSTR strCurFileName)
    {
        CString strPath = strCurFileName;
        if(!strPath.IsEmpty())
        {
            //-相对路径-
            if(strPath.Find(_T(":"))<=0)     
            {    
                strPath.Format(_T("%s%s"), GetExePath(TRUE), strCurFileName);   
            }    
        }    
        return strPath; 
    }
    
    #define LOG_EVENT _T("ChyLogWrite") 
    CString CLOG::s_strLogFile = _T(""); 
    CString CLOG::s_strLogPrefix = _T(""); 
    HANDLE CLOG::s_hWriteEvent = NULL; 
    
    CLOG::CLOG() 
    {
    }   
    CLOG::~CLOG() 
    {
    }   
    
    short CLOG::SetLogFile(LPCTSTR strPath)
    {
        if(strPath==NULL || strPath[0]==0)
            s_strLogFile = GetFileForExePath(_T("log.log"));
        else
            s_strLogFile = GetFileForExePath(strPath);
        return 1;
    }
    
    CString CLOG::GetLogFile()
    {
        return s_strLogFile;
    }
    
    short CLOG::ViewLogFile()
    {
        CString strLogFile = GetLogFile();
        ShellExecute(NULL, _T("open"), strLogFile, NULL, NULL, SW_SHOW);
        return strLogFile.IsEmpty()?0:1;
    }
    
    short CLOG::SetPrefix(LPCTSTR strPrefix)
    {
        if(strPrefix && strPrefix[0])
        {
            s_strLogPrefix = strPrefix;
        }
        return 1;
    }
    
    CString CLOG::sOutV(LPCTSTR strType, LPCTSTR strFormat, va_list valist)
    {
        CString   strPart_Prefix;
        if(!s_strLogPrefix.IsEmpty())
        {
            strPart_Prefix.Format(_T("[%s]"), s_strLogPrefix);
        }
        CString   strPart_Time;
        {
            SYSTEMTIME sysTime  = {0};
            GetLocalTime(&sysTime);
            strPart_Time.Format(_T("[%2d-%2d %2d:%2d:%2d_%3d]"),
                sysTime.wMonth, sysTime.wDay, 
                sysTime.wHour, sysTime.wMinute, sysTime.wSecond,
                sysTime.wMilliseconds); 
        }
        CString   strPart_Type;
        if(strType && strType[0])
        {
            strPart_Type.Format(_T("[%s]"), strType);
        }
        CString   strPart_Info;
        {  
            strPart_Info.FormatV(strFormat, valist);
        }
        CString str = strPart_Prefix + strPart_Time + strPart_Type+ strPart_Info;
        return str;
    }
    
    CString CLOG::sOut0(LPCTSTR strType, LPCTSTR strFormat,...)
    {
        va_list  valist;
        va_start(valist, strFormat);   
        CString strInfo = sOutV(strType, strFormat, valist);
        va_end(valist);
        return strInfo;
    }
    
    CString CLOG::sOut(LPCTSTR strFormat,...)
    {
        va_list  valist;
        va_start(valist, strFormat);
        CString strInfo = sOutV(NULL, strFormat, valist);
        va_end(valist);
        return strInfo;
    }
    short CLOG::OutV(LPCTSTR strType, LPCTSTR strFormat, va_list valist)
    {
        //--
        if(s_hWriteEvent==NULL)
        {
            s_hWriteEvent = OpenEvent(0, FALSE,LOG_EVENT);
            if(s_hWriteEvent==NULL)
                s_hWriteEvent = CreateEvent(NULL, FALSE, TRUE, LOG_EVENT);
        }
        WaitForSingleObject(s_hWriteEvent, INFINITE);
        //-打开关闭文件-
        if(s_strLogFile.IsEmpty())
            SetLogFile(NULL);
        CStdioFile file;
        if(file.Open(s_strLogFile, CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
        {
            setlocale(LC_CTYPE, "chs");//设定f
            CString  strPart_NewLine = _T("
    ");
            CString  strInfo = sOutV(strType, strFormat, valist); 
            CString  str = strInfo + strPart_NewLine;
            file.SeekToEnd();
            file.WriteString(str);
            file.Close();
            setlocale(LC_ALL, "C"); //还原区域设定
        }
        SetEvent(s_hWriteEvent);
        return 1;
    }
    
    short CLOG::Out0(LPCTSTR strType, LPCTSTR strFormat,...)
    {
        va_list  valist;
        va_start(valist, strFormat);   
        short rtn = OutV(strType, strFormat, valist);
        va_end(valist);
        return rtn;
    }
    
    short CLOG::Out(const char* pInfo)
    {
        if (s_hWriteEvent == NULL)
        {
            s_hWriteEvent = OpenEvent(0, FALSE, LOG_EVENT);
            if (s_hWriteEvent == NULL)
                s_hWriteEvent = CreateEvent(NULL, FALSE, TRUE, LOG_EVENT);
        }
        WaitForSingleObject(s_hWriteEvent, INFINITE);
        //-打开关闭文件-
        if (s_strLogFile.IsEmpty())
            SetLogFile(NULL);
        CStdioFile file;
        if (file.Open(s_strLogFile, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite))
        {
            setlocale(LC_CTYPE, "chs");//设定f
            CString  strPart_NewLine = _T("
    ");
            CString   strPart_Prefix;
            if (!s_strLogPrefix.IsEmpty())
            {
                strPart_Prefix.Format(_T("[%s]"), s_strLogPrefix);
            }
            CString   strPart_Time;
            {
                SYSTEMTIME sysTime = { 0 };
                GetLocalTime(&sysTime);
                strPart_Time.Format(_T("[%2d-%2d %2d:%2d:%2d_%3d]"),
                    sysTime.wMonth, sysTime.wDay,
                    sysTime.wHour, sysTime.wMinute, sysTime.wSecond,
                    sysTime.wMilliseconds);
            }
    
            CString str = strPart_Prefix + strPart_Time + pInfo + strPart_NewLine;
            file.SeekToEnd();
            file.WriteString(str);
            file.Close();
            setlocale(LC_ALL, "C"); //还原区域设定
        }
        SetEvent(s_hWriteEvent);
        return 1;
    }
    
    short CLOG::Out(LPCTSTR strFormat,...)
    {
        va_list  valist;
        va_start(valist, strFormat);
        short rtn = OutV(NULL, strFormat, valist);
        va_end(valist);
        return rtn;
    }

    使用范例:

    /-设定日志文件,建议在Exe初始化时设定-
    //-设置相对路径则表示exe所在路径下-
    //-如果不设定则为exe所在路径下的log.log文件-
    CLOG::SetLogFile("bbb.log");
    //-获取日志文本串,可以自行处理,例如输出到界面-
     CString str;
     str = CLOG::sOut0("debug", "hello");
     str = CLOG::sOut0("warn5", "hello %d", 25);
     str = CLOG::sOut0("warn3", "hello %s, you have %d apples!", "libai", 10);
     str = CLOG::sOut ("hello %s, you have %d apples!", "libai", 10);
     //-输出到文件-
     CLOG::Out0("debug", "hello");
     CLOG::Out0("warn5", "hello %d", 25);
     CLOG::Out0("warn3", "hello %s, you have %d apples!", "libai", 10);
     CLOG::Out ("hello %s, you have %d apples!", "libai", 10);
     //-查看日志文件-
     CLOG::ViewLogFile();

    原文地址:http://tiannanyi.blog.163.com/blog/static/1873593442013489035280/

  • 相关阅读:
    R中character和factor的as.integer的不同
    ggplot2练习
    R的plotmath
    Python数据科学手册(2) NumPy入门
    Python数据科学手册(1) IPython:超越Python
    ggplot2(6) 标度、坐标轴和图例
    R自带数据集
    ggplot2(5) 工具箱
    MATLAB神经网络(7) RBF网络的回归——非线性函数回归的实现
    ggplot2(4) 用图层构建图像
  • 原文地址:https://www.cnblogs.com/autumoonchina/p/8806497.html
Copyright © 2011-2022 走看看