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;
}