• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 23,  comments - 20,  trackbacks - 0
            前段時(shí)間自己寫(xiě)了一個(gè)日志類(lèi)  不過(guò)是MFC寫(xiě)的   今天閑著沒(méi)事  就用SDK重寫(xiě)了這個(gè)類(lèi)  算是增加一點(diǎn)可移植性吧...
            類(lèi)的使用也很簡(jiǎn)單  初始化的時(shí)候傳遞一個(gè)日志名稱(chēng) 
            然后在需要寫(xiě)日志的地方 直接調(diào)用這個(gè)對(duì)象的WriteLog函數(shù)傳遞一個(gè)字符串進(jìn)去就行了
            如果需要時(shí)間戳  則調(diào)用WriteLogWithTime函數(shù)  一樣的接口
            支持設(shè)置日志大小  SetLogSize()   //KB計(jì)算
            代碼很簡(jiǎn)單  一百來(lái)行  不過(guò)用著還算挺方便的  下午就用這個(gè)日志類(lèi)找到了一個(gè)以前工程中的SQL相關(guān)聯(lián)的BUG 呵呵 

            .h文件
            /*****************************************************
            *文件名稱(chēng): Log_SDK.h
            *功能說(shuō)明: 使用SDK + STL重寫(xiě)的一個(gè)日志類(lèi) 增加可移植性
            *創(chuàng)建時(shí)間: 09.10.31
            *文件作者: zip
            *****************************************************
            /
            #pragma once
            #include 
            <string>
            using namespace std;

            class LogSDK
            {
            public:
                LogSDK(
            string strFileName);
                
            ~LogSDK(void);
                BOOL InitLogSDK();
                BOOL WriteLog(TCHAR
            * pContent);
                BOOL WriteLogWithTime(TCHAR
            * pContent);        //每次寫(xiě)一行 且?guī)r(shí)間
                BOOL WriteLogAtFirstLine(TCHAR* pContent);    //將最近的日志寫(xiě)在最前面    
                void SetLogSize(int iSize);

            private:
                HANDLE m_hFile;
                
            string m_strFileName;
                
            string m_strFormat; 
                CRITICAL_SECTION m_cs;                
            //臨界區(qū)
                BOOL m_bInit;                            //初始化標(biāo)志位
                int m_iSize;                                //文件大小    -- KB計(jì)算

                
            string GetTimeStr();
            };

            .cpp文件
            /***************************************************
            *文件名稱(chēng): Log_SDK.cpp
            *功能說(shuō)明: LogSDK的實(shí)現(xiàn)文件
            *創(chuàng)建時(shí)間: 09.10.31
            *文件作者: zip
            ***************************************************
            /
            #include 
            "StdAfx.h"
            #include 
            ".\log_sdk.h"

            LogSDK::LogSDK(
            string strFileName)
            {
                m_bInit 
            = FALSE;
                m_strFileName 
            = strFileName;
                m_iSize 
            = 20;    //默認(rèn)20KB
                InitLogSDK();
            }

            LogSDK::
            ~LogSDK(void)
            {
                CloseHandle(m_hFile);
            }

            BOOL LogSDK::InitLogSDK()
            {    
                m_hFile 
            = CreateFile(m_strFileName.c_str() , GENERIC_ALL ,
                    FILE_SHARE_WRITE , NULL ,  OPEN_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL);
                
            if (m_hFile == INVALID_HANDLE_VALUE)
                {
                    DWORD dwErrorCode 
            = GetLastError();
                    TCHAR szErrMsg[
            255];
                    sprintf(szErrMsg , 
            "打開(kāi)文件失敗 , 錯(cuò)誤代碼:%d" , dwErrorCode);
                    
            //AfxMessageBox(szErrMsg);
                    MessageBox(NULL , szErrMsg , _T("警告") ,IDOK);
                    
            return FALSE;
                }
                ::InitializeCriticalSection(
            &m_cs);    //初始化臨界區(qū)
                m_bInit = TRUE;
                
            return TRUE;
            }

            //普通的寫(xiě)日志
            BOOL LogSDK::WriteLog(TCHAR* pContent)
            {
                ASSERT(m_bInit);
                DWORD dwFileLenHigh;
                DWORD dwFileLen 
            = GetFileSize(m_hFile , &dwFileLenHigh);
                
            if (dwFileLen > (DWORD)m_iSize * 1024)    //文件過(guò)大 清空文件
                {
                    SetFilePointer(m_hFile , 
            0 , NULL , FILE_BEGIN);    //移動(dòng)文件指針
                    SetEndOfFile(m_hFile);//清空文件
                }
                
            string strContent(pContent);
                strContent 
            += "\r\n";

                BOOL bRet 
            = TRUE;
                ::EnterCriticalSection(
            &m_cs);
                SetFilePointer(m_hFile , 
            0 , NULL , FILE_END);    //移動(dòng)到文件末尾
                DWORD dwWriteLen;
                BOOL bSuccess 
            = WriteFile(m_hFile , strContent.c_str() ,
                    (DWORD)strContent.length() , 
            &dwWriteLen , NULL);
                ASSERT(dwWriteLen 
            == strContent.length());
                
            if (!bSuccess)
                {
                    DWORD dwErrorCode 
            = GetLastError();
                    TCHAR szErrMsg[
            255];
                    sprintf(szErrMsg , 
            "寫(xiě)入日志文件失敗 , 錯(cuò)誤代碼:%d" , dwErrorCode);        
                    MessageBox(NULL , szErrMsg , _T(
            "發(fā)生了嚴(yán)重的錯(cuò)誤") , IDOK);
                    bRet 
            = FALSE;    //此處不用返回  還要釋放臨界區(qū)
                }
                ::LeaveCriticalSection(
            &m_cs);

                
            return bRet;
            }

            //帶有時(shí)間戳的日志
            BOOL LogSDK::WriteLogWithTime(TCHAR* pContent)
            {
                ASSERT(m_bInit);
                DWORD dwFileLenHigh;
                DWORD dwFileLen 
            = GetFileSize(m_hFile , &dwFileLenHigh);
                
            if (dwFileLen > (DWORD)m_iSize * 1024)    //文件過(guò)大 清空文件
                {
                    SetFilePointer(m_hFile , 
            0 , NULL , FILE_BEGIN);    
                    SetEndOfFile(m_hFile);
            //清空文件
                }
                
            //strcat(pContent , "\r\n");
                string strContent(pContent);
                strContent 
            += "\r\n";
                strContent.insert(
            0 , "  ");
                strContent.insert(
            0 , GetTimeStr());

                BOOL bRet 
            = TRUE;
                ::EnterCriticalSection(
            &m_cs);
                SetFilePointer(m_hFile , 
            0 , NULL , FILE_END);    //移動(dòng)到文件末尾
                DWORD dwWriteLen;
                BOOL bSuccess 
            = WriteFile(m_hFile , strContent.c_str() ,
                    (DWORD)strContent.length() , 
            &dwWriteLen , NULL);
                ASSERT(dwWriteLen == strContent.length());
                if (!bSuccess)
                {
                    DWORD dwErrorCode 
            = GetLastError();
                    TCHAR szErrMsg[
            255];
                    sprintf(szErrMsg , 
            "寫(xiě)入日志文件失敗 , 錯(cuò)誤代碼:%d" , dwErrorCode);        
                    MessageBox(NULL , szErrMsg , _T(
            "發(fā)生了嚴(yán)重的錯(cuò)誤") , IDOK);
                    bRet 
            = FALSE;    //此處不用返回  還要釋放臨界區(qū)
                }
                ::LeaveCriticalSection(
            &m_cs);

                
            return bRet;
            }

            //返回格式化的時(shí)間字符串
            string LogSDK::GetTimeStr()
            {
                SYSTEMTIME sys;
                ::GetLocalTime(
            &sys);    //獲取當(dāng)前系統(tǒng)時(shí)間
                TCHAR szTime[64];
                memset(szTime , 
            0 , 64);
                sprintf(szTime , 
            "%d-%02d-%02d %02d:%02d:%02d.%03d" , 
                    sys.wYear , sys.wMonth , sys.wDay , sys.wHour , sys.wMinute , sys.wSecond , sys.wMilliseconds);
                
            return string(szTime);
            }

            void LogSDK::SetLogSize(int iSize)
            {
                m_iSize 
            = iSize;
            }

            也可以算鍛煉一下API的操作吧...

            posted on 2009-10-31 17:58 李佳 閱讀(1162) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): WIN32 應(yīng)用開(kāi)發(fā)

            FeedBack:
            # re: 一個(gè)簡(jiǎn)單的日志類(lèi) SDK + STL寫(xiě)的[未登錄](méi)
            2009-12-02 14:36 | expter
            日志類(lèi)不用加鎖,看你的代碼,直接用singleton,對(duì)于一些日志可以看看boost,oege.cugi的寫(xiě)法。。。

              回復(fù)  更多評(píng)論
              
            <2009年9月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            常用鏈接

            留言簿

            隨筆分類(lèi)

            隨筆檔案

            文章檔案

            相冊(cè)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            99久久无色码中文字幕人妻| 久久精品国产久精国产果冻传媒 | 亚洲女久久久噜噜噜熟女| 久久精品无码一区二区app| 久久久久久噜噜精品免费直播| 久久久久se色偷偷亚洲精品av| 精品国产乱码久久久久久人妻| 无码国内精品久久人妻蜜桃 | 久久精品国产半推半就| 婷婷久久综合| 精品熟女少妇av免费久久| 亚洲综合久久夜AV | 国产精自产拍久久久久久蜜| 亚洲精品无码久久一线| 人妻无码精品久久亚瑟影视| 国产成人久久精品一区二区三区| 久久精品国产亚洲5555| 99精品国产在热久久| 久久久久亚洲AV无码专区首JN | 久久www免费人成看片| 精品久久久久一区二区三区| a级成人毛片久久| 无码专区久久综合久中文字幕| 久久久久国产| 国产精品女同一区二区久久| 久久se精品一区精品二区| 久久精品国产亚洲AV久| 色综合久久夜色精品国产| 久久高清一级毛片| 国产精品综合久久第一页| 9999国产精品欧美久久久久久| 国内精品九九久久久精品| 亚洲精品乱码久久久久久中文字幕 | 午夜精品久久久久久影视riav| 日日狠狠久久偷偷色综合96蜜桃 | 亚洲国产精品久久66| 丰满少妇人妻久久久久久4| 国产精品久久久久久久久免费| 国产精品久久久久久一区二区三区 | 久久精品国产91久久麻豆自制| 久久丫精品国产亚洲av|