目录

C++高易用日志库实现


使用教程

如何添加到项目中使用

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

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

项目目录如下:

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

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

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

CMake配置

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

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

include_directories(../my-logger)#具体为本项目的根目录,可用相对路径也可用绝对。此处是为了方便搜索头文件
link_directories(../my-logger/lib)#路径说明同上,该路径为链接库的目录

....

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

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

库的编译

下面为logger库的编译命令:

mkdir build-logger
cd build-logger
cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON
make

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

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

mkdir build-fmt
cd build-fmt
cmake ../dependencies/fmt/ -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON

同样会在 build-fmt 目录生成对应的动态库,建议同样放入该项目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"); //有效
}

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

日志输出介绍

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

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

fmt官方文档

#include"Logger.h"

int main(){
    debug("hello {}","world");
    info("world {}","hello");
}

注意:{} 是支持所有的C++标准库容器的,包括vector和string等等容器的直接打印,如 debug("{}",vector<int>{1,3,32,432,432}); 是可行的。但不要忘了链接 fmt 库。

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

https://vfchdrh6q6.feishu.cn/space/api/box/stream/download/asynccode/?code=YTdkMDViODc2ZjJhODk1NDVkNzE5YTg3NDc3MDcyNTBfV1JzUldsSGpzNkUwR0hteDNDaU1Eb1dSU24wM3p0M1FfVG9rZW46Ym94Y24xTGdPYkZ6VThiS0pXckxaZnN1YVJkXzE2NjI0Njk0NDk6MTY2MjQ3MzA0OV9WNA

整体架构