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 ...
随机推荐
- 用js来实现那些数据结构—目录
首先,有一点要声明,下面所有文章的所有内容的代码,都不是我一个人独立完成的,它们来自于一本叫做<学习JavaScript数据结构和算法>(第二版),人民邮电出版社出版的这本书.github ...
- 图灵程序设计丛书(SQL必知必会)笔记
SQL必知必会 第二课:检索数据 1.分页 (1).SQL Server 栗子 : select top 2 columns from tableName (2).Oracle 栗子 :select ...
- iOS 波浪效果的实现
iOS 波浪效果的实现 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #4f8187; background-c ...
- capwap学习笔记——capwap的前世今生(转)
1 capwap的前世今生 1.1 胖AP.瘦AP.AC 传统的WLAN网络都是为企业或家庭内少量移动用户的接入而组建的.因此,只需要一个无线路由器就可以搞定了,就好像现在家用的无线路由器就是胖AP. ...
- postman的安装与使用(模拟请求)
最近需要测试产品中的REST API,无意中发现了PostMan这个chrome插件,把玩了一下,发现postman秉承了一贯以来google工具强大,易用的特质.独乐乐不如众乐乐,特此共享出来给大伙 ...
- 分布式服务跟踪及Spring Cloud的实现
在分布式服务架构中,需要对分布式服务进行治理——在分布式服务协同向用户提供服务时,每个请求都被哪些服务处理?在遇到问题时,在调用哪个服务上发生了问题?在分析性能时,调用各个服务都花了多长时间?哪些调用 ...
- CSS布局十八般武艺都在这里了
CSS布局十八般武艺都在这里了 Shelley Lee 4 个月前 布局是CSS中一个重要部分,本文总结了CSS布局中的常用技巧,包括常用的水平居中.垂直居中方法,以及单列布局.多列布局的多种实现方式 ...
- 关于JSON字符串的处理与总结 【原创】
这两天帮另一个实习生处理点前端的问题 遇到点JSON的处理 总结如下 ①一个JSON字符串 JSON.Parse(JSON字符串)—>JSON对象Object ②一个JSONArray ...
- Android base-adapter-helper 源码分析与扩展
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/44014941,本文出自:[张鸿洋的博客] 本篇博客是我加入Android 开源项 ...
- Oracle解决Ora-01653无法扩展表空间问题
先针对可能性1查看表空间使用情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M) & ...