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
如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。
C++线程安全日志库-Win32接口实现的更多相关文章
- 自行实现的jar包中,日志库的适配实现
日常情况下,我们自己都会自行实现一些基础的jar包,如dao包.service包或一些其他完成特定功能的jar包.如果没有一套调试日志信息,出现问题时想查找问题非常不方便.可能大多数小伙伴都会有自 ...
- 【原创】go语言学习(十七)接口应用实战--日志库
目前 日志库需求分析 日志库接口设计 文件日志库开发 Console日志开发 日志使用以及测试 日志库需求分析 1.日志库需求分析 A. 程序运行是个黑盒B. 而日志是程序运行的外在表现C. 通过日志 ...
- 爆料喽!!!开源日志库Logger的剖析分析
导读 Logger类提供了多种方法来处理日志活动.上一篇介绍了开源日志库Logger的使用,今天我主要来分析Logger实现的原理. 库的整体架构图 详细剖析 我们从使用的角度来对Logger库抽茧剥 ...
- 爆料喽!!!开源日志库Logger的使用秘籍
日志对于开发来说是非常重要的,不管是调试数据查看.bug问题追踪定位.数据信息收集统计,日常工作运行维护等等,都大量的使用到.今天介绍著名开源日志库Logger的使用,库的地址:https://git ...
- C基础 多用户分级日志库 sclog
引言 - sclog 总的设计思路 sclog在之前已经内置到simplec 简易c开发框架中一个日志库. 最近对其重新设计了一下. 减少了对外暴露的接口. 也是C开发中一个轮子. 比较简单, 非常适 ...
- 超轻量级、高性能C日志库--EasyLogger
[ 声明:版权全部,欢迎转载.请勿用于商业用途. 联系信箱:armink.ztl@gmail.com] EasyLogger 1. 介绍 EasyLogger 是一款超轻量级(ROM<1.6K, ...
- C++第三方日志库Pantheios
C++第三方日志库Pantheios Kagula 2012-1-11 简介 在项目实践中发现一个好的日志记录非常重要,你需要借助Logging才能跟踪软件中的错误.所以这里研究下第三方C++库Pan ...
- C++ 日志库 boost::log 以及 glog 的对比
日志能方便地诊断程序原因.统计程序运行数据,是大型软件系统必不可少的组件之一.本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog . 设计 b ...
- 新写的c++日志库:log4K
网是开源的c/c++日志库也不少,但用起来总觉得不方便,于是动手写了一个C++日志框架Log4K. 测试代码: #include "log4k.h" #pragma comment ...
随机推荐
- CF877F
题目大意:给定n个数有正有负,有Q次询问,每次询问区间[l,r]中有几个子区间满足和为k 做法:显然的莫队 每次用map记录一下当前区间[l,r]中的前缀和的值的个数 然后r的话找sum[r]-k的, ...
- 架构之微服务设计(Nginx + Upsync)
Upsync,微博开源基于Nginx容器动态流量管理方案 . Nginx 以其超高的性能与稳定性,在业界获得了广泛的使用,微博的七层就大量使用了 Nginx .结合 Nginx 的健康检查模块,以及动 ...
- SSM博客
最近在写基于SSM 的博客,用的是spring+springmvc+mybatis搭建的,用的maven+github管理项目,目前完成了登录注册以及用户管理员的增删改查,后续的功能还需要完善,如何建 ...
- Java开源生鲜电商平台-支付模块的设计与架构(源码可下载)
Java开源生鲜电商平台-支付模块的设计与架构(源码可下载) 开源生鲜电商平台支付目前支持支付宝与微信.针对的是APP端(android or IOS) 1. 数据库表设计. 说明:无论是支付宝还 ...
- oracle的事务级别
ooracle的事务级别是不提交的,如果在sql语句中插入数据,如果不提交(commit).在程序里面试读不出来数据的.长时间不用oracle竟然忘了这些东西,特此记下.方便以后查看
- 一分钟告诉你究竟DevOps是什么鬼?
历史回顾 为了能够更好的理解什么是DevOps,我们很有必要对当时还只有程序员(此前还没有派生出开发者,前台工程师,后台工程师之类)这个称号存在的历史进行一下回顾. 如编程之道中所言: 老一辈的程序员 ...
- springboot+activemq中引入重发机制
一.简介 在使用activemq消息中间件进行消息队列传输时,总会由于各种原因导致消息失败. 一个经典的场景是一个生成者向Queue中发消息,里面包含了一组邮件地址和邮件内容.而消费者从Queue中将 ...
- spring配置文件中context:property-placeholder导入多个独立的配置文件
spring中 context:property-placeholder 导入多个独立的 .properties配置文件? Spring容器采用反射扫描的发现机制,在探测到Spring容器中有一个 o ...
- SSM-SpringMVC-02:SpringMVC最简单的小案例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 咱们这个案例做什么? 就是用处理器代替Servlet处理请求 开发步骤: 1.引入jar包 <!--单 ...
- TensorFlow练习2: 对评论进行分类
本帖是前一贴的补充: 使用大数据,了解怎么处理数据不能一次全部加载到内存的情况.如果你内存充足,当我没说 训练好的模型的保存和使用 使用的模型没变,还是简单的feedforward神经网络(updat ...

