分享一个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. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。


C++线程安全日志库-Win32接口实现的更多相关文章

  1. 自行实现的jar包中,日志库的适配实现

    ​ 日常情况下,我们自己都会自行实现一些基础的jar包,如dao包.service包或一些其他完成特定功能的jar包.如果没有一套调试日志信息,出现问题时想查找问题非常不方便.可能大多数小伙伴都会有自 ...

  2. 【原创】go语言学习(十七)接口应用实战--日志库

    目前 日志库需求分析 日志库接口设计 文件日志库开发 Console日志开发 日志使用以及测试 日志库需求分析 1.日志库需求分析 A. 程序运行是个黑盒B. 而日志是程序运行的外在表现C. 通过日志 ...

  3. 爆料喽!!!开源日志库Logger的剖析分析

    导读 Logger类提供了多种方法来处理日志活动.上一篇介绍了开源日志库Logger的使用,今天我主要来分析Logger实现的原理. 库的整体架构图 详细剖析 我们从使用的角度来对Logger库抽茧剥 ...

  4. 爆料喽!!!开源日志库Logger的使用秘籍

    日志对于开发来说是非常重要的,不管是调试数据查看.bug问题追踪定位.数据信息收集统计,日常工作运行维护等等,都大量的使用到.今天介绍著名开源日志库Logger的使用,库的地址:https://git ...

  5. C基础 多用户分级日志库 sclog

    引言 - sclog 总的设计思路 sclog在之前已经内置到simplec 简易c开发框架中一个日志库. 最近对其重新设计了一下. 减少了对外暴露的接口. 也是C开发中一个轮子. 比较简单, 非常适 ...

  6. 超轻量级、高性能C日志库--EasyLogger

    [ 声明:版权全部,欢迎转载.请勿用于商业用途. 联系信箱:armink.ztl@gmail.com] EasyLogger 1. 介绍 EasyLogger 是一款超轻量级(ROM<1.6K, ...

  7. C++第三方日志库Pantheios

    C++第三方日志库Pantheios Kagula 2012-1-11 简介 在项目实践中发现一个好的日志记录非常重要,你需要借助Logging才能跟踪软件中的错误.所以这里研究下第三方C++库Pan ...

  8. C++ 日志库 boost::log 以及 glog 的对比

    日志能方便地诊断程序原因.统计程序运行数据,是大型软件系统必不可少的组件之一.本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog . 设计 b ...

  9. 新写的c++日志库:log4K

    网是开源的c/c++日志库也不少,但用起来总觉得不方便,于是动手写了一个C++日志框架Log4K. 测试代码: #include "log4k.h" #pragma comment ...

随机推荐

  1. SpringMVC配置多个数据源

    多数据源,说白了,就是多数据库. 想要实现多数据库查询,只需简单四步即可实现! 第一步: 配置 jdbc.properties: # MySQL #========================== ...

  2. 箭头函数不会修改this

    function Person () { this.name = 'little bear', this.age = 18 setTimeout(()=>{ console.log(this ) ...

  3. Qt5.7 实现Https 认证全过程解析(亲自动手版)

    #### NetworkRequestManager.h #include <QSsl>#include <QSslKey>#include <QSslSocket> ...

  4. java.util.logging的使用

    秉承着某种执念我今天决定不用Logback而是和Java的logging肛到底,现在总结一下研究成果: 日志等级 日志等级有七种,severe,warning,info,fine,finer,fine ...

  5. Proxy SwitchyOmega配合Shawdowsocks使用的配置

    国内环境如果想使用Shawdowsocks来FQ,几乎一定会装ProxyOmega来进行配合使用,简单讲讲ProxyOmega如何和Shawdowsocks进行协同. 准备 Google chrome ...

  6. Java多线程-线程的同步与锁【转】

    出处:http://www.cnblogs.com/linjiqin/p/3208843.html 一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程 ...

  7. Python_文件与文件夹操作

    ''' os模块除了提供使用操作系统功能和访问文件系统的简便方法之外,还提供了大量文件与文件夹操作的方法. os.path模块提供了大量用于路径判断.切分.连接以及文件夹遍历的方法. shutil模块 ...

  8. mysql 和 oracle 的一些小知识

    有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MYSQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MYSQL迁到ORAC ...

  9. System.nanoTime理解

    JDK1.5之后java中的计时给出了更精确的方法:System.nanoTime(),输出的精度是纳秒级别,这个给一些性能测试提供了更准确的参考. 但是这个方法有个需要注意的地方,不能用来计算今天是 ...

  10. datePicker.js 应用

    var calendar2 = new datePicker();calendar.init({ 'trigger': '#datetime-picker-start', /*选择器,触发弹出插件*/ ...