c++之一个方便的日志库

概述

  • 本文演示环境: win10 + vs2017
  • 日志,我用的很少,通常是用作动态库调试使用。
  • 日志记录下来,基本就没看过,除非模块出现了问题。
  • 使用cmake管理的项目
  • 使用C++封装了C语言读写文件实现了的记录日志,
  • 避免使用c++流,因为效率低。
  • 默认是写文本文件,其他格式? 以后再开放接口吧
  • 因为是纯C++ 配合C语言,可以通过绝大部分编译器编译。已经通过 clang++ + msvc 编译。

更新日志:

05-16-2021
 1.修复写十六进制时只有一位的情况。(格式化字符串多了一个空格)

05-04-2021 
 1. init_函数中 增加日志文件存放路径创建返回值检查,如果存放日志文件路径创建失败,则无法写入日志。 
 2. init_函数完善注释说明

项目下载

可以再 gitee 下载

日志文件接口

使用很简单:1 初始化,2,写日志,3.释放。

	/// ----------------------------------------------------------------------------------------
	/// 日志文件接口类
	/// ----------------------------------------------------------------------------------------
	class ilog
	{
	public:
		///  --------------------------------------------------------------------------------
		///  	初始化, 
		///  @info - 日志信息
		///  @return - int	
		/// 			0 - 成功
		///				1 - 失败,日志文件路径不正确
		///				2 - 失败,如果磁盘空间剩余不够,则禁止创建日志文件对象
		///				3 - 失败,无法创建日志文件路径, 无法写入日志
		///				5 - 失败,创建日志文件失败,则无法写入日志
		///  --------------------------------------------------------------------------------
		virtual int init_(const oct_toolkits::st_log_info& info) = 0;




		///  --------------------------------------------------------------------------------
		///  写日志,日志内容为文本,且每一行前面都带有时间; 例如: [2021-03-28 15:00:00:001] 日志文件内容
		///  @str_log - 待写入日志文件内容
		///  @return - int	
		/// 			0 - 成功
		///				1 - 无法写入日志,可能是日志文件创建失败,或者磁盘剩余空间不足5G
		///				2 - 失败,无法创建写日志文件对象,请先初始化
		///  --------------------------------------------------------------------------------
		virtual int log_text_(const std::string& str_log) = 0;

		///  --------------------------------------------------------------------------------
		///  	写日志
		///  @pdata - 待写入内容
		///  @pdata_len - 待写入长度
		///  @return - int	
		/// 			0 - 成功、
		///				1 - 失败,参数【pdata】为空或者参数【pdata_len】为0
		///				2 - 失败,无法写入日志,可能是日志文件创建失败,或者磁盘剩余空间不足5G
		///				3 - 失败,无法写入,日志文件读写对象创建失败,请先初始化
		///  --------------------------------------------------------------------------------
		virtual int log_text_(const char* pdata, unsigned int pdata_len) = 0;

		///  --------------------------------------------------------------------------------
		///  	将参数【str_log】每个字节的16进制写入文件,全部大写
		///  @str_log - 待写入内容
		///  @return - int	
		///				0 - 成功
		/// 			1 - 无法写入日志,可能是日志文件创建失败,或者磁盘剩余空间不足5G
		///				2 - 失败,无法写入,日志文件读写对象创建失败,请先初始化
		///  --------------------------------------------------------------------------------
		virtual int log_hex_(const std::string& str_log) = 0;

		///  --------------------------------------------------------------------------------
		///  	将参数【pdata】每个字节的16进制写入文件,全部大写
		///  @pdata - 待写入内容
		///  @pdata_len - 写入内容长度
		///  @return - int	
		/// 			0 - 成功
		///				1 - 失败,参数【pdata】为空或者参数【pdata_len】为0
		///				2 - 失败,无法写入日志,可能是日志文件创建失败,或者磁盘剩余空间不足5G
		///				3 - 失败,无法写入,日志文件读写对象创建失败,请先初始化
		///  --------------------------------------------------------------------------------
		virtual int log_hex_(const char* pdata, unsigned int pdata_len) = 0;


		///  --------------------------------------------------------------------------------
		///  	释放内部资源
		///  @return - void	
		/// 			
		///  --------------------------------------------------------------------------------
		virtual void uninit_() = 0;
	};

因为项目需要,需要将数据写文本文件,且将数据写16进制,比如,字符串 "1234567890", 将每个字符的ASCII的十六进制写文件。

完整使用范例

#include <iostream>
#include <oct_toolkits.h>
void call_log_()
{

	using namespace oct_toolkits;
	using namespace std;
	/// 创建文件对象
	ilog* plog = create_ilog_();
	if (NULL == plog)
	{
		cout << "call_log, plog = null";
		return;
	}


	st_log_info info;
	info.path_					= std::string("C:\\game\\file_demo\\log\\send");
	info.prefix_				= std::string("C");
	info.postfix_				= std::string("fc");
	info.type_					= std::string(".log");

	int ret						= plog->init_(info);
	if (0						!= ret)
	{
		cout << "call log, init, ret =" << ret;
	}

	else
	{
		cout << "call log, init success";
	}
	/// ----------------------------------------------------------------------------------------

	/// 写文本
	std::string str_text("1234567890");
	plog->log_text_(str_text);
	char arr2[] = {"9876543210"};
	plog->log_text_(arr2, 10);

	/// 写十六进制
	plog->log_hex_(str_text);
	plog->log_hex_(arr2, 10);

	plog = release_ilog_(plog);

}


int main(int argc, char* argv[], char* env[])
{

	//call_file();
	call_log_();


	//system("pause");
	return 0;
}

日志文件内容

posted @ 2021-03-28 18:43  mohist  阅读(851)  评论(0编辑  收藏  举报