分享一個C++日誌庫,使用Win32接口編寫,並且是線程安全的日誌庫。比較簡單,只有2個文件,容易上手,使用起來也很簡單windows
以下是日誌庫的頭文件,接口看似不少,可是使用起來最經常使用的也就那麼幾個緩存
#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();