• <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的寫法。。。

              回復  更多評論
              
            <2013年11月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久国产热精品波多野结衣AV| 欧美精品久久久久久久自慰| 久久久久18| 亚洲国产成人久久精品99| 亚洲精品无码久久久久sm| 精品久久一区二区三区| 综合久久精品色| 久久精品成人| 久久av无码专区亚洲av桃花岛| 久久人人爽人人爽AV片| 国产V综合V亚洲欧美久久| 亚洲а∨天堂久久精品9966| 国产成人久久精品一区二区三区 | 亚洲日本久久久午夜精品| 久久夜色精品国产噜噜噜亚洲AV| 国内精品久久久久影院网站| 久久av无码专区亚洲av桃花岛| 无码人妻少妇久久中文字幕| 久久成人影院精品777| 色婷婷综合久久久中文字幕| 综合久久精品色| 中文成人无码精品久久久不卡 | 91精品国产91久久久久久| 久久精品国产亚洲AV蜜臀色欲| 99久久精品免费看国产一区二区三区| 久久久免费精品re6| 狼狼综合久久久久综合网| 久久精品国产99国产精品导航| 久久天天日天天操综合伊人av| 日本免费一区二区久久人人澡| 国内精品久久久久| 丁香五月网久久综合| 久久精品国产亚洲精品2020| 亚洲色大成网站WWW久久九九| 久久久亚洲AV波多野结衣| 久久天天躁夜夜躁狠狠| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 亚洲AV乱码久久精品蜜桃| 久久夜色精品国产噜噜亚洲AV| 日韩精品久久久久久免费| 国产精品久久久久久搜索|