使用教程
如何添加到项目中使用
输入以下命令得到项目文件
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");
}
复制代码
打印输出如下:
整体架构
领取专属 10元无门槛券
私享最新 技术干货