当前位置: 首页 > java >正文

日志管理--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(...)
http://www.xdnf.cn/news/17676.html

相关文章:

  • 前端项目一键换肤
  • IEEE 2025 | 重磅开源!SLAM框架用“法向量+LRU缓存”,将三维重建效率飙升72%!
  • 单例模式,动态代理,微服务原理
  • 操作系统1.6:虚拟机
  • 从原理到实践:一文掌握Kafka的消息生产与消费
  • 【bug 解决】串口输出字符乱码的问题
  • pdftk - macOS 上安装使用
  • 干货分享|如何从0到1掌握R语言数据分析
  • OpenAI传来捷报,刚刚夺金IOI,实现通用推理模型的跨越式突破
  • 如何实现PostgreSQL的高可用性,包括主流的复制方案、负载均衡方法以及故障转移流程?
  • 【接口自动化】-11-接口加密签名 全局设置封装
  • 容器安全扫描工具在海外云服务器环境的集成方法
  • Element用法---Loading 加载
  • npm、pnpm、yarn区别
  • 一周学会Matplotlib3 Python 数据可视化-绘制饼状图(Pie)
  • 前沿技术借鉴研讨-2025.8.12 (数据不平衡问题)
  • Web项目Excel文件处理:前端 vs. 后端,企业级如何选择?
  • 【3】Transformers快速入门:大语言模型LLM是啥?
  • 11-docker单机版的容器编排工具docker-compose基本使用
  • centos 7 如何安装 ZipArchive 扩展
  • MySQL 数据库表操作与查询实战案例
  • MySQL概述
  • 计算机网络:ovn数据通信都是用了哪些协议?
  • 集成电路学习:什么是URDF Model统一机器人描述格式模型
  • 智能合约执行引擎在Hyperchain中的作用
  • 北京-4年功能测试2年空窗-报培训班学测开-第七十三天-投递简历-[特殊字符][特殊字符]
  • LangChain 框架 Parser 讲解
  • 介绍一下jQuery的AJAX异步请求
  • Nacos-1--什么是Nacos?
  • vue+flask基于规则的求职推荐系统