Renalog日志库简介及使用说明

renalog是一个C++的轻量级日志库 提供了日志的创建和简单的解析功能
最初在Windows系统下使用MinGW-W64环境完成开发 遵循C++11标准 目前正在尝试对源码做部分修改 以达到跨平台的目的

目录:

  1. renalog库的编译
  2. 引入库头文件
  3. renalog的基础使用
  4. renalog_reader日志分析库的使用
  5. 函数及返回值列表

1. renalog库的编译

renalog库使用CMake进行代码管理 编译时建议使用CMake自带的GUI

CMake GUI在第一次Configure后的编译选项

如上图所示 renalog库共有四个编译选项:

编译选项 作用 默认值
BUILD_RELEASE 编译Release版库 关闭则编译Debug版库 ON
BUILD_SHARED 编译动态库 ON
BUILD_STATIC 编译静态库 ON
BUILD_LOGREADER_FUNCTION 编译renalog_reader日志分析库 ON

调整完编译选项后 再次执行Configure 直到没有红色报错后执行Generate
随后进入编译文件夹 在该文件夹下打开终端依次执行 (此处以MinGW为例):

mingw32-make
mingw32-make install

若一切正常 终端界面应该如图所示:

正常的完整make流程

请务必注意: 若没有更改默认安装位置 install命令需要终端拥有管理员权限 否则会出现权限不足报错
此时只需重新打开一个拥有管理员权限的终端并重新执行install即可

然后前往安装位置 应该能看到一个名叫renalog的文件夹 内有bin include lib三个子文件夹
在他们其中依次是renalog的动态链接库 头文件和静态链接库
随后将该文件夹拷出 使用时只需按需链接动态或静态库即可

2. 引入库头文件

首先需要添加通过安装得到的include文件夹作为头文件目录
当编译了renalog的日志分析库 在安装库文件时会一同安装renalog.h头文件 在其中包含了其余需要引用的头文件
因此 如果编译了日志分析库 使用时只需在程序内加上

  • #include"renalog/renalog.h"

但如果没有编译日志分析库 则不会安装renalog.h头文件 使用时就需要如此引入头文件:

  • #include"renalog/renalog_core.h"

当然 直接引用需要的模块的头文件也是可以的 比如:

  • #include"renalog/renalog_core.h"
  • //引入renalog日志库主体 (日志创建库)

  • #include"renalog/renalog_read.h"
  • //引入renalog_reader日志分析库

一般来说在使用renalog库时按需引用头文件即可

3. renalog的基础使用

renalog库内成员均被封装在命名空间rena下 使用时需注意命名空间引用

3.1 初始化renalog类

要实现基础的日志创建功能 应使用rena命名空间下的renalog类 比如:

  • rena::renalogrl("log");

这样会在程序内创建一个名为rl的对象 之后所有的日志创建 日志记录等等的功能皆需要在该对象下实现
同时 也需要在创建renalog对象时使用类构析函数 指定日志的保存路径 (日志保存路径可为绝对路径也可为相对路径)
在创建rl对象的同时 renalog会自动定位到给到的日志保存路径 并检查该路径是否存在
若不存在 renalog会自动创建该路径 如果他有创建该路径的权限

3.2 创建日志文件

renalog需要一个日志标头以创建日志文件 比如:

  • rl.open("logtest");

在这里 logtest就是该日志的标头 标头加上创建时间便是日志的文件名
如果我们在2022年12月11日15:25:30时创建了这个日志文件 那么日志文件的文件名便是:

logtest_20221211.15.25.30.log

直到关闭该日志文件前 所有的日志都会被记录在该文件中
而一旦日志文件被关闭 renalog库就无法再往其中写入日志 需要重新按上面的步骤创建新日志文件

3.3 记录日志

本节将介绍如何使用renalog来记录日志
renalog主要使用log成员函数来记录不同类型的日志内容 他的函数定义如下:

  • voidrena::renalog::log(rena::lt__lt,std::string__from,std::string__info);

由此可见 renalog在记录日志时需要提供三个参数: 日志类型 日志来源和日志内容

renalog支持三种日志类型: INFO WARNINGERROR 分别代表普通信息 警告和错误
不同于某些日志库 renalog只提供日志的记录功能 并不会干预程序其他部分的运行 也就意味着即使renalog收到了一条错误日志 也只会记录该日志 而不会执行像停止程序等等的其他指令
renalog提供了lt枚举类型 用作日志类型的标识符 一同封装在命名空间rena下
在填写日志类型时可以使用:

  • rena::lt::INFO
  • rena::lt::WARNING
  • rena::lt::ERROR

日志来源则是用来标明该条日志是在哪一个位置被记录的 应为一个不含冒号的字符串 (冒号会被自动替换为空格)
renalog允许在一个日志文件内出现多个不同的日志来源

同时日志内容应为一个没有换行符的字符串 若在内容内换行则会在读取日志时产生读取不全的错误

这段程序段展示了一个创建日志的实例:

  • rl.log(rena::lt::INFO,"test_function","Hello World!");

在执行这段语句后 便会在日志文件中如下记录:

[INFO    2022.12.12 09:39:24.542482]test_function: Hello World!

易见renalog的日志记录从前往后依次为日志类型 日志记录时间 日志来源和日志内容
日志记录的内容不应该被人为更改 否则在使用renalog的日志分析库时可能会发生错误

同时 renalog也支持在日志中加入换行和注释 以方便直接打开日志文件进行分析
以下是一些实例:

  • rl.wrap();
  • //在日志文件中插入换行

  • rl.comment("Begin test function");
  • //在日志文件中插入注释

其中在插入注释后 会在日志文件中记录以下内容:

# Begin test function

注释内容不会被日志分析库解析

3.4 关闭日志文件

若无需继续记录日志 或者要重新创建一个新的日志文件 则需要用到close成员函数

  • rl.close();

这样 renalog将会关闭当前的日志流并清空所有缓存 继续记录日志将需要重新创建
另外: 目前renalog不支持在初始化后更改日志保存路径 这个限制可能会在后续版本中被移除

3.5 完整使用实例

本节将介绍一个renalog库基础使用的实例

  • //renalog basic function test
  • #include"renalog/renalog.h"
  • rena::renalogrl("log");
  • intmain(){
  •   rl.open("logtest");
  •   rl.comment("Begin test function");
  •   rl.wrap();
  •   rl.log(rena::lt::INFO,"test_function","This is an Info");
  •   rl.log(rena::lt::WARNING,"test_function","This is a Warning");
  •   rl.log(rena::lt::ERROR,"test_function","This is an Error");
  •   rl.close();
  •   return0;
  • }

在执行该代码后 在exe同目录下应出现一个名为log的子目录 其中包含一个日志文件
因为我是在2022年12月12日11时50分33秒执行的程序 那么该日志文件的文件名就应该为:

logtest_20221212.11.50.33.log

该日志文件的内容应为:

# Begin test function

[INFO 2022.12.12 11:50:33.015556]test_function: This is an Info
[WARNING 2022.12.12 11:50:33.015556]test_function: This is a Warning
[ERROR 2022.12.12 11:50:33.015556]test_function: This is an Error

4. renalog_reader日志分析库的使用

本章将介绍renalog_reader日志分析库的使用方法
使用本章内容时 请确保在编译renalog库时勾选了编译renalog_reader日志分析库选项 否则本章内容是不可用的
具体见本文第一章 renalog库的编译

4.1 初始化renalog_reader类

初始化renalog_reader类的方式和初始化renalog类十分类似:

  • rena::renalogreaderrlr("log");

初始化renalog_reader类时同样需要指定日志保存路径 绝对相对路径皆可
而不同于renalog类的是 初始化renalog_reader类时要求该日志保存路径必须存在 否则将抛出错误 例如:

[renalog runtime] ERROR -> renalogreader class constructor: log file folder "log" doesn't exist

这行报错代表着: 没有找到日志保存路径"log"

4.2 打开日志文件

renalog_reader日志分析库一样使用open成员函数打开日志文件
在打开日志文件时 需要指明日志的标头和日志的创建时间
比如: 在日志文件夹内有一日志文件 其文件名为:

logtest_20221215.12.05.30.log

那么为了打开该日志文件 则有两种不同的方法:

  • rlr.open("logtest","20221215.12.05.30");
  • //直接以字符串形式指定日志创建时间

  • rlr.open("logtest",2022,12,15,12,5,30);
  • //按照年月日时分秒的顺序依次指定日志创建时间

这两种方法没有本质上的区别 按照习惯或场景选用即可

4.3 解析打开的日志文件

renalog_reader日志分析库不会自动解析打开的日志文件 日志的解析需要使用parse成员函数手动启动

  • rlr.parse();

完成解析后便可以获取日志内的内容
请注意: renalog_reader日志分析库被设计为只为renalog库服务 没有考虑任何日志被手动更改或传入不符合renalog库日志格式的日志文件的情况
这意味着: 使用renalog_reader日志分析库解析被手动更改或不是由renalog库创建的日志文件 导致被解析的日志文件的格式和renalog库日志格式不同从而造成解析出错时 renalog_reader不会主动抛出任何错误或异常
因此请避免手动更改日志文件内容 以规避不必要的错误