• <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
            前段時間自己寫了一個日志類  不過是MFC寫的   今天閑著沒事  就用SDK重寫了這個類  算是增加一點可移植性吧...
            類的使用也很簡單  初始化的時候傳遞一個日志名稱 
            然后在需要寫日志的地方 直接調(diào)用這個對象的WriteLog函數(shù)傳遞一個字符串進去就行了
            如果需要時間戳  則調(diào)用WriteLogWithTime函數(shù)  一樣的接口
            支持設(shè)置日志大小  SetLogSize()   //KB計算
            代碼很簡單  一百來行  不過用著還算挺方便的  下午就用這個日志類找到了一個以前工程中的SQL相關(guān)聯(lián)的BUG 呵呵 

            .h文件
            /*****************************************************
            *文件名稱: Log_SDK.h
            *功能說明: 使用SDK + STL重寫的一個日志類 增加可移植性
            *創(chuàng)建時間: 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);        //每次寫一行 且?guī)r間
                BOOL WriteLogAtFirstLine(TCHAR* pContent);    //將最近的日志寫在最前面    
                void SetLogSize(int iSize);

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

                
            string GetTimeStr();
            };

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

            LogSDK::LogSDK(
            string strFileName)
            {
                m_bInit 
            = FALSE;
                m_strFileName 
            = strFileName;
                m_iSize 
            = 20;    //默認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 , 
            "打開文件失敗 , 錯誤代碼:%d" , dwErrorCode);
                    
            //AfxMessageBox(szErrMsg);
                    MessageBox(NULL , szErrMsg , _T("警告") ,IDOK);
                    
            return FALSE;
                }
                ::InitializeCriticalSection(
            &m_cs);    //初始化臨界區(qū)
                m_bInit = TRUE;
                
            return TRUE;
            }

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

                BOOL bRet 
            = TRUE;
                ::EnterCriticalSection(
            &m_cs);
                SetFilePointer(m_hFile , 
            0 , NULL , FILE_END);    //移動到文件末尾
                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 , 
            "寫入日志文件失敗 , 錯誤代碼:%d" , dwErrorCode);        
                    MessageBox(NULL , szErrMsg , _T(
            "發(fā)生了嚴重的錯誤") , IDOK);
                    bRet 
            = FALSE;    //此處不用返回  還要釋放臨界區(qū)
                }
                ::LeaveCriticalSection(
            &m_cs);

                
            return bRet;
            }

            //帶有時間戳的日志
            BOOL LogSDK::WriteLogWithTime(TCHAR* pContent)
            {
                ASSERT(m_bInit);
                DWORD dwFileLenHigh;
                DWORD dwFileLen 
            = GetFileSize(m_hFile , &dwFileLenHigh);
                
            if (dwFileLen > (DWORD)m_iSize * 1024)    //文件過大 清空文件
                {
                    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);    //移動到文件末尾
                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 , 
            "寫入日志文件失敗 , 錯誤代碼:%d" , dwErrorCode);        
                    MessageBox(NULL , szErrMsg , _T(
            "發(fā)生了嚴重的錯誤") , IDOK);
                    bRet 
            = FALSE;    //此處不用返回  還要釋放臨界區(qū)
                }
                ::LeaveCriticalSection(
            &m_cs);

                
            return bRet;
            }

            //返回格式化的時間字符串
            string LogSDK::GetTimeStr()
            {
                SYSTEMTIME sys;
                ::GetLocalTime(
            &sys);    //獲取當前系統(tǒng)時間
                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 李佳 閱讀(1174) 評論(1)  編輯 收藏 引用 所屬分類: WIN32 應(yīng)用開發(fā)

            FeedBack:
            # re: 一個簡單的日志類 SDK + STL寫的[未登錄]
            2009-12-02 14:36 | expter
            日志類不用加鎖,看你的代碼,直接用singleton,對于一些日志可以看看boost,oege.cugi的寫法。。。

              回復(fù)  更多評論
              
            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            少妇久久久久久被弄到高潮| 中文字幕无码久久人妻| 国内精品久久久久影院免费| 国产精品久久自在自线观看| 久久午夜福利电影| 久久这里只有精品18| 99久久国产综合精品网成人影院| 内射无码专区久久亚洲| 国产精品9999久久久久| 欧美久久综合九色综合| 国产精品久久久久影院嫩草| 欧美久久综合九色综合| 777久久精品一区二区三区无码| 亚洲日韩欧美一区久久久久我| 97r久久精品国产99国产精| 香蕉99久久国产综合精品宅男自 | 久久国产高清一区二区三区| 久久久久亚洲精品日久生情| 久久国产免费| 久久久久国产精品| 7777久久亚洲中文字幕| 97香蕉久久夜色精品国产| 国产视频久久| 亚洲国产精品人久久| 亚洲精品高清国产一线久久| 国产精品欧美亚洲韩国日本久久 | 热久久国产精品| 色综合久久久久久久久五月| 欧洲成人午夜精品无码区久久| 精品综合久久久久久98| 一本大道久久东京热无码AV| 久久久久亚洲精品中文字幕| 久久久久亚洲?V成人无码| 91精品国产色综久久| 国产一区二区精品久久凹凸| 久久99精品久久久久久噜噜 | 久久精品夜夜夜夜夜久久| 久久永久免费人妻精品下载| 91视频国产91久久久| 91麻精品国产91久久久久| 999久久久免费国产精品播放|