日志管理--g3log
文章目录
- 1. 前言
- 2. g3log 安装与使用
- 3. 用户定制化
- 3.1 文件头的重载
- 3.2 默认日志格式重载
1. 前言
大家在开发项目时,相信都非常希望对自己的日志进行管理操作,今天给大家介绍一个licence友好并开源的日志管理框架g3log
,它是由g2log的演变而来,相比g2log有发幅度的性能提升。
G3log 主要特性:
-
日志和契约式设计框架
-
异步调用
-
线程安全
-
队列式日志
-
捕获和记录 SIGSEGV 以及其他严重的信号
-
在 Linux/OSX 上严重的信号会生成堆栈记录
-
G3log 跨平台,支持 Windows, Linux 和 OSX
G3Log仓库地址:https://github.com/KjellKod/g3log
G3Log使用文档:https://kjellkod.github.io/g3log
2. g3log 安装与使用
编译与安装
git clone git@github.com:KjellKod/g3log.git
cd KjellKod
cmake . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./build/g3log -DADD_G3LOG_UNIT_TEST=OFF
cmake --build build --target install -j
执行完成后,g3log将被安装到./build/g3log
下面,当然也可以设置为自定义的路径。如果需要跑g3log的测试,可以将ADD_G3LOG_UNIT_TEST
设置为ON
,需要注意的是,设置为ON
后,install是会install gtest,如果不需要的话,可以手动清理掉。
测试:
#include <g3log/g3log.hpp>
#include <g3log/logworker.hpp>int main() {// 创建日志工作者auto worker = g3::LogWorker::createLogWorker();auto handle = worker->addDefaultLogger("example", "./");// 初始化日志系统g3::initializeLogging(worker.get());// 记录日志LOG(INFO) << "Hi log";LOG(WARNING) << "Printf-style syntax is also available";return 0;
}
会在当前目录下生成以example
开头的log文件
从上面代码可以看出,通过addDefaultLogger
函数接口,可以设置log文件的文件名前缀以及存放路径
用户可以通过handle->call(&g3::FileSink::fileName)
来获取当前日志文件名。
std::future<std::string> log_file_name = sinkHandle->call(&FileSink::fileName);
3. 用户定制化
3.1 文件头的重载
默认的文件头可以通过调用下面的api来进行定制化重载
FileSink::overrideLogHeader(std::string);
3.2 默认日志格式重载
默认日志格式被定义在LogMessage.hpp
static std::string DefaultLogDetailsToString(const LogMessage& msg);
用户可以通过调用下面的回调函数来给日志文件加一个thread ID
static std::string FullLogDetailsToString(const LogMessage& msg);
用法如下:
auto worker = g3::LogWorker::createLogWorker();auto handle= worker->addDefaultLogger(argv[0], path_to_log_file);g3::initializeLogging(worker.get());handle->call(&g3::FileSink::overrideLogDetails, &LogMessage::FullLogDetailsToString);
用户还可以自定义格式函数,日志函数格式取决于对LogMessage::toString(...)
的重载,如下:
namespace {std::string MyCustomFormatting(const LogMessage& msg) {... how you want it ...}}void MyCustomSink::ReceiveLogEntry(LogMessageMover message) {std::string formatted = message.get().toString(&MyCustomFormatting) << std::flush;}
...
...auto worker = g3::LogWorker::createLogWorker();auto sinkHandle = worker->addSink(std::make_unique<MyCustomSink>(),&MyCustomSink::ReceiveLogMessage);// ReceiveLogMessage(...) will used the custom formatting function "MyCustomFormatting(...)