• 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();
    

    喜欢的留下邮箱


    如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!!




    很重要--转载声明

    1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords

    2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。


  • 相关阅读:
    13: SQL client 使用 UDF demo
    短信开发系列(二):GSM手机短信开发之短信解码
    短信开发系列(一):GSM手机短信开发初探
    短信开发系列(三):短信接收引擎
    STM32定时器触发ADC多通道连续采样,DMA缓存结果[原创www.cnblogs.com/helesheng]
    电流互感器、电压互感器原理及其调理电路设计(2021全国大学生电赛H题基础知识)[原创www.cnblogs.com/helesheng]
    obs学习之3——obs初始化、析构
    obs学习之2——初识各个模块
    obs学习之4——枚举设备、选择设备
    obs学习之1——概览
  • 原文地址:https://www.cnblogs.com/swarmbees/p/10785828.html
Copyright © 2020-2023  润新知