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

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

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

                
            string GetTimeStr();
            };

            .cpp文件
            /***************************************************
            *文件名稱: Log_SDK.cpp
            *功能說明: LogSDK的實現文件
            *創建時間: 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);    //初始化臨界區
                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(
            "發生了嚴重的錯誤") , IDOK);
                    bRet 
            = FALSE;    //此處不用返回  還要釋放臨界區
                }
                ::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(
            "發生了嚴重的錯誤") , IDOK);
                    bRet 
            = FALSE;    //此處不用返回  還要釋放臨界區
                }
                ::LeaveCriticalSection(
            &m_cs);

                
            return bRet;
            }

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

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

              回復  更多評論
              
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            99久久国产热无码精品免费| 久久久久亚洲精品中文字幕| 思思久久好好热精品国产| 亚洲?V乱码久久精品蜜桃 | 国产亚洲精品久久久久秋霞| 久久天天躁狠狠躁夜夜躁2014| 狠狠色婷婷久久综合频道日韩| 亚洲AV无码久久| 精品国产婷婷久久久| 国内精品人妻无码久久久影院导航| 久久亚洲中文字幕精品有坂深雪| 中文字幕亚洲综合久久| 久久精品国产日本波多野结衣 | 亚洲国产天堂久久综合网站| 亚洲天堂久久久| 久久国产美女免费观看精品 | 99精品国产在热久久| 中文字幕久久精品| 国产精品免费久久久久影院| 久久精品国产亚洲av麻豆蜜芽| 国产精品gz久久久| 91精品国产综合久久久久久| 久久大香萑太香蕉av| 国产精品成人无码久久久久久| 亚洲va久久久噜噜噜久久天堂| 精品久久久久久无码中文字幕 | 久久人人爽人人爽人人片av高请| 久久精品中文字幕一区| 色成年激情久久综合| 久久人人爽人人爽人人AV| 无码人妻少妇久久中文字幕| 国产成人久久精品麻豆一区| 国产精品久久久久久久| 国产亚洲精品美女久久久| 日韩人妻无码精品久久免费一 | 7国产欧美日韩综合天堂中文久久久久| 久久WWW免费人成一看片| 亚洲午夜精品久久久久久app| 色偷偷91久久综合噜噜噜噜| 久久精品国产亚洲7777| 久久久WWW成人免费精品|