首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C+实现超级易用的日志库

使用教程

如何添加到项目中使用

输入以下命令得到项目文件

git clone https://github.com/ACking-you/my-logger.git

复制代码

项目目录如下:

dependencies:整个项目的外部依赖,以源码形式存在(比如fmt库)。

lib:整个项目已经打包好的库文件,我打包的是动态库,如有静态库需要请自行编译。库的名称为logger和fmt。

其余均为项目关键源码,就Logger.cpp和Logger.h两个。main.cc是项目运行测试代码。

CMake配置

由于本人对  的  指令了解的并不深入,所以本库并不支持最后的  ,为了防止大伙编译库的长时间等待,我已经编译好了动态库版本,所以直接拿去用即可(当然不排除环境的不兼容,所以可能还是需要手动编译)。

如果你clone本项目和你的项目为同级目录,请在你的cmake文件中添加下面的代码,然后再链接这两个库便可得到本库的所有支持。

include_directories(../my-logger)#具体为本项目的根目录,可用相对路径也可用绝对。此处是为了方便搜索头文件

link_directories(../my-logger/lib)#路径说明同上,该路径为链接库的目录

....

target_link_libraries($ logger fmt)#添加对应的链接库

复制代码

注意:如果你不需要使用fmt库中的高级功能,那么你可以不链接fmt库,如果需要使用其高级功能进行打印(比如支持打印std::map等标准库容器),那么请链接fmt库。

库的编译

下面为logger库的编译命令:

mkdir build-logger

cd build-logger

cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON

make

复制代码

输入上面的命令后,会在  文件夹中生成对应的动态库(不定义第二个变量时默认编译静态库)。建议把这个生成的动态库移动到这个项目  目录中,方便在使用时只需添加之前的cmake代码。

下面为fmt库的编译命令(由于该库较大,编译时间可能较久,我的电脑用了将近十分钟):

mkdir build-fmt

cd build-fmt

cmake ../dependencies/fmt/ -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON

复制代码

同样会在  目录生成对应的动态库,建议同样放入该项目lib目录中,注意 fmt 库的动态库是由多个文件构成,这多个文件都需要被放在一起。

如何使用库

如何配置

如下,为整个日志的所有配置项目,当然你也可以不进行配置,也有对应的默认值

#include"Logger.h"

int main(){

Config::Set({

.print_flag = LstdFlags |

lblog::LthreadId, //设置打印的内容,有日期、时间、文件名(长、短)、行号、线程id这些选项可选 (默认为LstdFlags包含Ldata | Ltime | Lshortname | Lline

.output_prefix = "my", //设置输出日志的前缀名,默认为空

.output_file = "./log.txt", //设置输出日志的文件,默认为空

.is_console = true //设置是否输出到控制台,默认为true

});

}

复制代码

注意:如果需要调用此配置函数进行配置,需要在所有打印日志宏调用之前,且同一个进程请不要使用两次配置(因为整个配置是一个单例,配置的更改在同一个进程中会是非线程安全的行为)。

精确控制输出等级

我们的库共提供以下五种宏来进行日志的打印:

debug、info、warn、error、fatal

使用debug进行日志输出的,在release模式下将不再进行输出。

我们同样也可以通过手动定义对应的宏控制日志输出等级。

#define LOG_LIMIT_WARN

#include "Logger.h"

int main(){

debug("hhh"); //无效

info("hhh"); //无效

warn("hhh"); //有效

error("hhh"); //有效

fatal("hhh"); //有效

}

复制代码

同理也可以通过  控制至少是error等级才输出日志。

日志输出介绍

前面介绍了基本的日志的控制,接下来介绍打印输出的功能,以debug和info为例:

本日志的最终输出使用的是C++第三方库 fmt ,虽然在C++20中它已经入标准库了,但是距离我们真正的使用还需要一段时间,下面是简单输出方式,更多的输出方式可以查看fmt官方文档:

fmt官方文档

#include"Logger.h"

int main(){

debug("hello {}","world");

info("world {}","hello");

}

复制代码

注意: 是支持所有的C++标准库容器的,包括vector和string等等容器的直接打印,如  是可行的。但不要忘了链接 fmt 库。

上面的默认输出效果如下:(控制台内是带颜色的,文件就没有颜色了)

增加回调支持

如果你有统一的格式需求可以通过在最开始的Config中增加对应的回调函数,before对应的是基本格式打印之前的处理,end对应的是基本格式打印之后的处理。

将上面的代码做如下配置,并输出:

#include"Logger.h"

using namespace lblog;

int main(){

Config::Set({

.before = [](FILE* f){ fmt::print(f,bg(fmt::color::blue),"我是before函数");},

.end = [](FILE* f)

});

debug("hello {}","world");

info("world {}","hello");

}

复制代码

打印输出如下:

整体架构

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230206A001DC00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券