C++日志库plog使用指南

news2024/9/22 22:41:56

前言

  • 之前介绍过一个C语言日志库 轻量级c语言开源日志库log.c介绍,源代码只有不到200行,使用非常方便。
  • 但是也存在很多缺点,比如日志时间只支持打印到秒,没有作多线程处理,不支持日志回滚。在小型项目或者测试demo中使用还可以,在大型项目中,就无法满足需求了。
  • 于是又找到了一个C++日志库plog,虽然代码量较多,但使用也非常简单,并且功能非常强大,可以满足在大型项目中的使用需求。

plog简介

  • plog 是一个轻量级、跨平台的C++日志库,它设计简洁且易于使用。有以下特点
    • 简单易用: plog 提供了直观的API,允许开发者以简洁的方式在代码中添加日志记录功能。例如,通过LOGD, LOGI, LOGW, LOGE等宏定义来分别表示不同级别的日志输出(如debug、info、warning和error)。
    • 多线程支持: plog 设计为线程安全的,可以安全地在多线程环境下使用,确保各个线程的日志记录不会相互干扰。
    • 多种日志级别: 支持多种日志级别,可以根据需要调整输出的日志详细程度,只显示重要信息或者包括所有调试细节。
    • 文件回滚与滚动日志: plog 允许配置日志文件的大小限制和循环策略,当达到一定大小时会自动创建新的日志文件,以实现日志的滚动存储。
    • 异步/同步日志写入: 可以根据需求选择同步或异步的方式来写入日志,提高程序性能,尤其是在大量日志产生时。
    • 可扩展性: plog 提供了自定义appender的能力,用户可以创建自己的日志接收器,将日志输出到各种不同的目标,如文件、数据库、网络等。
    • 跨平台兼容: plog 能够在多个操作系统和编译器下运行,如Windows、Linux、macOS等,并且兼容多种C++标准。
    • 体积小巧: plog 的源代码量小,占用资源少,适合嵌入式系统或其他对体积敏感的应用场景

使用步骤

  • 下载源代码后,将根目录下include目录下的所有文件拷贝到我们自己的工程下,然后在工程中包含对应的头文件即可。

使用示例

基本功能

  • 通过一个示例演示下基本功能。
  • 测试代码 : main.cpp
  •   #include <plog/Log.h> // Step1: include the header.
      #include <plog/Initializers/RollingFileInitializer.h>
      #include <plog/Appenders/ColorConsoleAppender.h>
      #include <string.h>
      #include <iostream>
      #include <iomanip>
      
      
      void polgFunc(){
      	PLOG_DEBUG << "DEBUG join polgFunc func";
      	PLOG_INFO << "DEBUG join polgFunc func";
      	PLOG_ERROR << "DEBUG join polgFunc func";
      }
      
      int main()
      {
          // 日志初始化
          // 参数1 - 日志级别, 参数2 - 日志文件名, 参数3 - 单个日志大小, 参数4 - 日志回滚数
          // 如果不想实现日志回滚,参数3和参数4可以不填或者填0
          plog::init(plog::info, "plog.log", 1024, 5);
      
          // 同时打印到控制台
          plog::ColorConsoleAppender<plog::TxtFormatter> consoleAppender;
          plog::get()->addAppender(&consoleAppender); // Also add logging to the console.
      
      
          int iData = 10020;
          double fData = 3.141592654; 
          std::string sData = "hello plog";
      
          PLOG_DEBUG << "debug hello log!"; 
          LOG_INFO << "info hello log!";
          PLOG_WARNING << "warning hello log!";
          PLOG_ERROR << "error hello log!";
      
          PLOG_INFO << "int data : " << iData;
          PLOG_INFO << "int hex data : " << std::hex << iData;
          
          PLOG_INFO << "float data : " << fData;
          PLOG_INFO << "float data : " << std::fixed << std::setprecision(2) << fData;
      
          PLOG_INFO << "string data : " << fData;
      
          polgFunc();
      
          system("pause");
          return 0;
      }
    
  • 控制台打印
    在这里插入图片描述
  • 文件打印:在当前目录下会生成一个 plog.log 文件
    在这里插入图片描述
  • 日志回滚 : 文件超出我们设置的大小后,可以自动回滚
    在这里插入图片描述

进阶功能 - 自定义日志打印格式

  • 对测试代码进行修改 main.cpp
  •   #include <plog/Log.h> // Step1: include the header.
      #include <plog/Initializers/RollingFileInitializer.h>
      #include <plog/Appenders/ColorConsoleAppender.h>
      #include <string.h>
      #include <iostream>
      #include <iomanip>
      
      // 自定义日志格式器
      namespace plog
      {
          class MyFormatter
          {
          public:
              static util::nstring header() // This method returns a header for a new file. In our case it is empty.
              {
                  return util::nstring();
              }
      
              static util::nstring format(const Record& record) // This method returns a string from a record.
              {
                  util::nostringstream ss;
                  util::Time t;
                  t.time = record.getTime().time;
                  struct tm *ltime = localtime(&t.time);
                  t.millitm = record.getTime().millitm;
                  // 在这里设置日志打印的格式
                  ss << "[plog] ["<<ltime->tm_year + 1900 <<"/"<< std::setfill(PLOG_NSTR('0')) << std::setw(2) << ltime->tm_mon + 1 <<"/"<< std::setfill(PLOG_NSTR('0')) << std::setw(2) << ltime->tm_mday << "_";
                  ss << std::setfill(PLOG_NSTR('0')) << std::setw(2) << ltime->tm_hour << PLOG_NSTR(":") << std::setfill(PLOG_NSTR('0')) << std::setw(2) << ltime->tm_min << PLOG_NSTR(":") << std::setfill(PLOG_NSTR('0')) << std::setw(2) << ltime->tm_sec << ".";
                  ss << std::setfill(PLOG_NSTR('0')) << std::setw(3) <<t.millitm << "] ";
                  ss << std::setw(5) << std::left << std::setfill(PLOG_NSTR(' ')) <<severityToString(record.getSeverity()) <<" [" << record.getTid()<< "]"<<" [" << record.getFunc() << ":" << record.getLine() << "] " << record.getMessage() << "\n";
                  return ss.str();
              }
          };
      }
      
      
      void polgFunc(){
      	PLOG_DEBUG << "DEBUG join polgFunc func";
      	PLOG_INFO << "DEBUG join polgFunc func";
      	PLOG_ERROR << "DEBUG join polgFunc func";
      }
      
      int main()
      {
          // 日志初始化
          // 参数1 - 日志级别, 参数2 - 日志文件名, 参数3 - 单个日志大小, 参数4 - 日志回滚数
          // 如果不想实现日志回滚,参数3和参数4可以不填或者填0
          // plog::init(plog::info, "plog.log", 1024, 5);
          plog::init<plog::MyFormatter>(plog::info, "plogformat.log", 1024, 5); 
      
          // 同时打印到控制台
          plog::ColorConsoleAppender<plog::TxtFormatter> consoleAppender;
          plog::get()->addAppender(&consoleAppender); // Also add logging to the console.
      
      
          int iData = 10020;
          double fData = 3.141592654; 
          std::string sData = "hello plog";
      
          PLOG_DEBUG << "debug hello log!"; 
          LOG_INFO << "info hello log!";
          PLOG_WARNING << "warning hello log!";
          PLOG_ERROR << "error hello log!";
      
          PLOG_INFO << "int data : " << iData;
          PLOG_INFO << "int hex data : " << std::hex << iData;
          
          PLOG_INFO << "float data : " << fData;
          PLOG_INFO << "float data : " << std::fixed << std::setprecision(2) << fData;
      
          PLOG_INFO << "string data : " << fData;
      
          polgFunc();
      
          system("pause");
          return 0;
      }
    
  • 文件打印:再运行看下文件中的打印
    在这里插入图片描述
  • 可以看到,打印的格式就是我们自定义的格式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1464189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何将cocos2d-x js打包部署到ios上 Mac M1系统

项目环境 cocos2d-x 3.13 xcode 12 mac m1 big sur 先找到你的项目 使用xcode软件打开上面这个文件 打开后应该是这个样子 执行编译运行就好了 可能会碰到的错误 在xcode11版本以上都会有这个错误&#xff0c;这是因为iOS11废弃了system。 将上面代码修改为 #if (CC_TARGE…

打败茅台的“老酒”

作者&#xff1a;翻篇 琥珀酒研社快评&#xff1a; 最可恨的 从来不是什么强大敌人 而是美名其曰的猪队友 要不怎么有网友说 酒鬼酒太惨了 当年要不是败给内鬼 又曝出塑化剂事件 错过白酒发展的黄金十年 不说打败茅台、五粮液 但成为另一个茅台、五粮液 那完全有希…

【智慧零售】门店管理设备解决方案,为企业数字化运营升级赋能

2023年我国零售总额超47万亿元&#xff0c;广阔的市场提供了更多机遇&#xff0c;同时随着日趋激烈的竞争&#xff0c;企业也正面临着一些挑战&#xff1a;如何才能有效提升门店生产效率&#xff1f;降低门店运营成本&#xff1f;提高市场竞争力&#xff1f; 零售企业认识到通…

Vue3 + Ts (使用lodash)

安装 npm i --save lodash使用 import _ from lodash⚠️报警告&#xff1a;&#xff01;&#xff01;&#xff01; 此时还需要安装ts声明文件库 npm install types/lodash -D安装之后重启Vscode还是会提示上面的警告&#xff0c;此时还需在tsconfig.ts里面配置 {"c…

QT day2 2.21

1.使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 代码&#xff1a; #include "mywidget.h" #include "ui_mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(pa…

C语言文件操作学习【2】—— 文件的顺序读写

顺序读写函数介绍 函数名功能适用于fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets文本行输入函数所有输入流fputs文本行输出函数所有输出流fscanf格式化输入函数所有输入流fprintf格式化输出函数所有输出流fread二进制输入文件fwrite二进制输出文件 上面说的…

Cartographer框架简述

catographer框架分为前端和后端 前端包括雷达数据处理&#xff1b;位姿预测&#xff1b;扫描匹配和栅格地图更新。 后端包括后端&#xff1a;线程池任务与调度&#xff1b;向位姿图添加节点&#xff0c;计算节点的子图内约束和子图间约束&#xff08;回环检测&#xff09;&…

HAL STM32 HW I2C DMA + SSD1306/SH1106驱动示例

HAL STM32 HW I2C DMA SSD1306/SH1106驱动示例 &#x1f4cd;硬件I2C DMA驱动参考&#xff1a;https://blog.csdn.net/weixin_45065888/article/details/118225993 &#x1f4cc;github上的相关项目&#xff1a;https://github.com/taburyak/STM32_OLED_SSD1306_HAL_DMA &am…

typescript映射类型

ts映射类型简介 TypeScript中的映射类型&#xff08;Mapped Type&#xff09;是一种高级类型&#xff0c;它允许我们基于现有类型创建新的类型&#xff0c;同时对新类型的每个属性应用一个转换函数。通过使用映射类型&#xff0c;我们可以方便地对对象的属性进行批量操作&…

猫头虎分享已解决Bug || 系统更新失败(System Update Failure):UpdateError, UpgradeFailure

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

nginx详细教程

一、nginx简介 1. 概述 Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;在 BSD-like 协议下发行。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上 nginx 的并发能力在同类型的网页服务器中…

VMware连通问题

虚拟机配好后发现竟然到网关都不通做了一系列排查后 最后在真机上查看发现VMware的NAT服务没有开启 WinR输入services.msc&#xff0c;启动VMware NAT Service后问题就解决了&#xff01;

【软件架构】02-复杂度来源

1、性能 1&#xff09;单机 受限于主机的CPU、网络、磁盘读写速度等影响 在多线程的互斥性、并发中的同步数据状态等&#xff1b; 扩展&#xff1a;硬件资源、增大线程池 2&#xff09;集群 微服务化拆分&#xff0c;导致调用链过长&#xff0c;网络传输的消耗过多。 集…

L2 清点代码库----PTA(疑问)

上图转自新浪微博&#xff1a;“阿里代码库有几亿行代码&#xff0c;但其中有很多功能重复的代码&#xff0c;比如单单快排就被重写了几百遍。请设计一个程序&#xff0c;能够将代码库中所有功能重复的代码找出。各位大佬有啥想法&#xff0c;我当时就懵了&#xff0c;然后就挂…

基于SpringBoot+MyBatis-Plus的教务管理系统

基于SpringBootMyBatis-Plus的教务管理系统 教务管理系统开发技术功能模块代码结构数据库设计运行截图源码获取 教务管理系统 欢迎访问此博客&#xff0c;是否为自己的毕业设计而担忧呢&#xff1f;是否感觉自己的时间不够做毕业设计呢&#xff1f;那你不妨看一下下面的文章&a…

QFileDialog文件选择对话框

QFileDialog 类是 Qt 框架中用于处理文件对话框的一个类&#xff0c;它继承自 QDialog。QFileDialog 提供了标准的文件选择对话框&#xff0c;使用户能够选择文件或目录。这个类可以用于打开或保存文件&#xff0c;也可以用来选择目录。 主要功能 打开和保存文件&#xff1a;…

什么是测试?测试测什么?

笔者是软件测试方向的硕士研究生。作为应届生拿下了20余个软件测试、测试开发的offer。 《校招生如何准备测试》系列会将我的测试理论体系与大家分享、探讨和学习。本期主要串联一下什么是测试、软件测试测什么&#xff08;测试类型&#xff09;。 Q&#xff1a;什么是软件测…

华清远见嵌入式学习——驱动开发——DAY8

作业要求&#xff1a; 1.使用GPIO子系统编写LED灯驱动&#xff0c;应用程序测试 2.注册三个按键的中断&#xff0c;只需要写内核代码 需要发布到CSDN 作业答案&#xff1a; GPIO子系统&#xff1a; 代码效果&#xff1a; 应用程序&#xff1a; #include<stdlib.h> …

【MySQL】学习连接查询和案例演示

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-vycqHoIbdg9sSKEo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

收单外包机构备案2023年回顾和2024年展望

孟凡富 本文原标题为聚合支付深度复盘与展望&#xff0c;首发于《支付百科》公众号&#xff01; 收单外包服务机构在我国支付收单市场中占据着举足轻重的地位&#xff0c;其规模在政策引导和市场需求驱动下不断扩大。同时&#xff0c;随着行业自律管理体系的持续发展和完善&a…