C++線程安全日誌庫-Win32接口實現

分享一個C++日誌庫,使用Win32接口編寫,並且是線程安全的日誌庫。比較簡單,只有2個文件,容易上手,使用起來也很簡單windows

頭文件

以下是日誌庫的頭文件,接口看似不少,可是使用起來最經常使用的也就那麼幾個緩存

  • WriteProgramLogNoMask:用來輸出日誌
  • InitProgramLogExByBuf:初始化日誌庫
  • CloseProgramLog:關閉日誌輸出,刷新內存到文件
#if !defined(__LOG_H__)
#define __LOG_H__

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <windows.h>

/*使用方法
  InitProgramLogExByBuf();
  WriteProgramLogNoMask("%s %s", "aa", "bb");       // 輸出 aa bb
  CloseProgramLog();
*/

namespace RLBase {

#ifdef __cplusplus
    extern "C"
    {
#endif

        // 參數定義同BaseInitProgramLog
        XHBASE_API void DeleteProgramLog(LPCTSTR pProjectName = NULL, LPCTSTR pLogFilePath = NULL);

        // BaseInitProgramLog函數的參數定義
        // DWORD dwMask的定義
#define BASE_LOG_MASK_ALL       0xFFFFFFFF

        // DWORD dwFlag的定義
#define BASE_LOG_DELETE_MASK        0x0000000F  // 控制日誌的大小
#define BASE_LOG_DELETE_NO      0x00000000  // 不自動刪除日誌文件,dwMaxLogFileSize/dwMaxReserveSize參數無任何意義
#define BASE_LOG_DELETE_INIT        0x00000001  // 在初始化的時候根據文件大小來刪除日誌文件
#define BASE_LOG_DELETE_CLOSE   0x00000002  // 在關閉的時候根據文件大小來刪除日誌文件
#define BASE_LOG_DELETE_WRITE   0x00000004  // 在寫日誌的時候根據文件大小來刪除日誌文件

#define BASE_LOG_RELEASE            0x80000000  // Release版本也輸出日誌,默認只有Debug版本輸出日誌
#define BASE_LOG_SAFE           0x40000000  // 日誌文件是否加密
#define BASE_LOG_PROJECTNAME        0x20000000  // 日誌文件是否顯示項目名稱
#define BASE_LOG_THREADID       0x10000000  // 顯示線程ID
#define BASE_LOG_TIME           0x08000000  // 日誌文件是否顯示時間戳

#ifdef __BASE_LOG_RELEASE__ 
#define BASE_FLAG_INIT          (BASE_LOG_DELETE_WRITE | BASE_LOG_RELEASE | BASE_LOG_PROJECTNAME | BASE_LOG_THREADID | BASE_LOG_TIME | BASE_LOG_SAFE)
#else
#define BASE_FLAG_INIT          (BASE_LOG_DELETE_WRITE | BASE_LOG_RELEASE | BASE_LOG_PROJECTNAME | BASE_LOG_THREADID | BASE_LOG_TIME)
#endif

#define __BASE_LOG_ENABLE__

#ifdef __BASE_LOG_ENABLE__

    // DWORD dwMask 掩碼,控制哪些日誌須要真正寫入
    // DWORD dwFlag 標誌位
    // DWORD dwLogBufSize 日誌緩衝區的大小,0爲不使用緩衝,-1爲使用默認緩衝大小(100K),其它爲實際緩衝區的大小
    // DWORD dwMaxLogFileSize 日誌文件的最大尺寸(單位:KB),0表明不自動刪除日誌文件
    // DWORD dwMaxReserveSize 日誌文件的最大保留尺寸(單位:KB),0表明所有刪除,不保留
    // LPCTSTR pProjectName 項目名稱,若是爲NULL,取exe文件名
    // LPCTSTR pLogFilePath 日誌文件路徑,能夠爲絕對路徑和相對路徑,若是爲相對路徑,前面添加exe所在的目錄,若是爲NULL,則爲exe所在的目錄+log\\+pProjectName.log
    XHBASE_API void InitLog(const wchar_t* company, const wchar_t* product, const wchar_t* programName = NULL);
    XHBASE_API void InitProgramLog(DWORD dwMask = BASE_LOG_MASK_ALL, DWORD dwFlag = BASE_FLAG_INIT, DWORD dwLogBufSize = -1, DWORD dwMaxLogFileSize = 0, DWORD dwMaxReserveSize = 0, LPCTSTR pProjectName = NULL, LPCTSTR pLogFilePath = NULL);
    XHBASE_API void InitProgramLogEx(DWORD dwMask = BASE_LOG_MASK_ALL, LPCTSTR pProjectName = NULL, LPCTSTR pLogFilePath = NULL);
    XHBASE_API void InitProgramLogExByBuf(DWORD dwMask = BASE_LOG_MASK_ALL, LPCTSTR pProjectName = NULL, LPCTSTR pLogFilePath = NULL);

    XHBASE_API void CloseProgramLog();

    XHBASE_API void FlushProgramLog();  // 把緩存的日誌寫入文件

    XHBASE_API void WriteProgramLogString(DWORD dwMask, LPCTSTR lpszLogText);
    XHBASE_API void WriteProgramLogBin(DWORD dwMask, LPCTSTR lpszFront, LPCTSTR lpszBack, LPCTSTR lpszBuf, DWORD uBufLength);
    XHBASE_API void WriteProgramLog(DWORD dwMask, LPCTSTR lpszFormat, ...);
    XHBASE_API void WriteProgramLogNoMask(LPCTSTR lpszFormat, ...);

#define WriteProgramLogStringNoMask(lpszLogText)                        WriteProgramLogString(BASE_LOG_MASK_ALL,lpszLogText)
#define WriteProgramLogBinNoMask(lpszFront,lpszBack,lpszBuf,nBufLength) WriteProgramLogBin(BASE_LOG_MASK_ALL,lpszFront,lpszBack,lpszBuf,nBufLength)

#else   // __BASE_LOG_ENABLE__

#define InitProgramLog                                                      __noop
#define InitProgramLogEx                                                        __noop
#define InitProgramLogExNoBuf                                                   __noop
#define CloseProgramLog()                                                   __noop
#define FlushProgramLog()                                                   __noop
#define WriteProgramLogString(dwMask,lpszLogText)                           __noop
#define WriteProgramLogBin(dwMask,lpszFront,lpszBack,lpszBuf,nBufLength)    __noop
#define WriteProgramLog                                                     __noop
#define WriteProgramLogNoMask                                               __noop

#define WriteProgramLogStringNoMask(lpszLogText)                            __noop
#define WriteProgramLogBinNoMask(lpszFront,lpszBack,lpszBuf,nBufLength)     __noop

#endif  // __BASE_LOG_ENABLE__

#ifdef __cplusplus
    }
#endif

    //}}
}
    
#endif // !defined(__BASE_PROGRAMLOG_H__)

使用方式也比較簡單:

InitProgramLogExByBuf();
WriteProgramLogNoMask("%s %s", "aa", "bb");       // 輸出 aa bb
CloseProgramLog();

喜歡的留下郵箱




轉載聲明:本站文章無特別說明,皆爲原創,版權全部,轉載請註明:朝十晚八 or Twowords安全

相關文章
相關標籤/搜索