分享一个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();