C++线程安全日志库-Win32接口实现

分享一个C++日志库,使用Win32接口编写,而且是线程安全的日志库。比较简单,只有2个文件,容易上手,使用起来也很简单

头文件

如下是日志库的头文件,接口看似很多,但是使用起来最常用的也就那么几个

  • 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


猜你喜欢

转载自www.cnblogs.com/swarmbees/p/10785828.html