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

              回復  更多評論
              
            <2016年10月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产一级持黄大片99久久| 波多野结衣久久精品| 无码精品久久久久久人妻中字| 精品欧美一区二区三区久久久| 91麻精品国产91久久久久| 国产精品禁18久久久夂久| 久久精品亚洲一区二区三区浴池 | 久久久亚洲欧洲日产国码是AV| 久久最新免费视频| 亚洲国产精品无码久久青草| 欧美性大战久久久久久| 久久精品中文字幕一区| 久久久噜噜噜久久中文福利| 人妻少妇久久中文字幕一区二区| 亚洲欧美伊人久久综合一区二区| 久久99国内精品自在现线| 97久久精品人人做人人爽| 久久久久久久久久久免费精品| 日本亚洲色大成网站WWW久久 | 久久精品中文字幕一区| 久久亚洲精品中文字幕| 国产成人综合久久综合| 国产成人久久精品二区三区| 亚洲美日韩Av中文字幕无码久久久妻妇| 一本大道久久东京热无码AV | 精品久久久久久无码不卡| 亚洲AV无码久久精品成人| 久久夜色精品国产亚洲| 开心久久婷婷综合中文字幕| 漂亮人妻被黑人久久精品| 久久免费国产精品一区二区| 一本久久a久久精品综合香蕉| 久久综合给合久久狠狠狠97色| 亚洲国产精品久久久久婷婷软件 | 久久久久99精品成人片试看| 2021最新久久久视精品爱| 三上悠亚久久精品| 久久综合五月丁香久久激情| 久久婷婷五月综合色奶水99啪| 久久99亚洲综合精品首页| 亚洲日本va中文字幕久久|