C++使用工具进阶(LOG输出、堆栈跟踪、代码结构、code review)

news2024/10/5 19:15:54

0. 简介

对于C++,无论是大学生还是算法工程师都是非常需要学习并使用的一门语言,而C++不像python、rust一样简单好用。不单单是在嵌套复杂代码后的逻辑还是各种类和堆栈的管理,都是非常头疼的问题。一般来说对于LOG类很多都是使用GLOG、而堆栈跟踪一般是基于GDB。而这里我们将开拓大家眼界,从另一个角度来说一些小而美的东西。这里整合一些网上非常好的博客,并结合自己的一些理解给大家整理一个非常通用的工具,也欢迎各位关注引用文章的博主。

1. RLOG

在现代软件开发中,日志记录系统是不可或缺的一部分。它不仅可以帮助开发人员在应用程序中定位和解决问题,还可以用于监控、性能分析、安全审计等方面。本文将介绍日志记录系统的基本概念、重要性以及如何构建一个高效的日志记录系统。

1.1 构建日志记录系统的关键步骤

  • 日志级别与分类:日志级别包括调试(Debug)、信息(Info)、警告(Warning)、错误(Error)等。不同级别的日志用于不同目的,例如调试时使用调试日志来追踪代码执行,而错误日志用于记录严重的问题。选择合适的日志级别可以避免日志信息过于冗杂或过于稀少。
  • 日志格式与结构:一个良好的日志格式应包括时间戳、日志级别、模块/组件名以及具体的日志消息。统一的格式使得日志易于阅读和分析。例如:[时间戳] [日志级别] [模块名] - 日志消息
  • 异步日志写入:为避免阻塞应用程序的正常执行,可以采用异步日志写入方式。日志消息被缓冲并在适当的时机写入磁盘,从而提高应用程序的性能。
  • 日志存储与滚动:考虑使用滚动策略,定期归档或删除旧的日志文件,以免日志文件无限增大。选择适当的存储方式,如本地文件、数据库或云存储。
  • 上下文信息:除了基本的日志信息外,还可以在日志中添加上下文信息,如用户ID、请求ID、会话ID等。这些信息有助于在复杂的分布式系统中跟踪请求流程。
    敏感信息与安全:避免将敏感信息(如密码、API密钥)写入日志。同时,实施权限控制,限制对日志文件的访问,确保敏感信息不被滥用。
  • 日志分析与可视化:利用日志分析工具或平台,对日志进行聚合、搜索和可视化分析。这有助于发现模式、趋势以及潜在问题。

1.2 Rlog组件

Rlog作为一款高性能的纯C语言日志组件,为开发人员提供了一种轻松、灵活且可定制的日志记录解决方案。对于Rlog而言

  • 它支持用户自定义输出端点(例如:串口终端、网络中断、Flash…),输出端点以插件形式自定义扩展。
  • 日志内容可包含日志等级、时间戳、行号,函数信息,文件信息;
  • 支持多种操作系统(RT-Thread、Linux…),也支持裸机平台;
  • 日志输出支持:printf原始格式,日志等级输出,hexdump输出;
├── example
│   ├── rlog_linux_adapter.c        /* linux环境下的适配接口 */
│   └── rlog_rtt_adapter.c          /* rt-thread环境下的适配接口 */
├── include/
│   ├── rlog_adapter.h              /* rlog适配描述 */
│   └── rlog.h                      /* rlog对外接口 */
├── main.c                          /* rlog的测试样例 */
├── Makefile                        /* linux环境rlog构建Makefile */
├── plug-in                         /* 输出端点插件的存放路径 */
├── SConscript                      /* rt-thread环境rlog构建脚本 */
└── src
    ├── rlog.c                      /* rlog核心代码 */
    ├── rlog_def.h                  /* rlog核心代码使用的定义 */
    └── rlog_utils.c                /* rlog使用的C库接口 */

1.3 灵活配置与使用

1.3.1 静态配置:
  1. 静态配置采用宏定义的方式,用户可直接修改rlog_adapter.h头文件的宏定义,就可以修正相关配置;
  2. 静态配置的管控权限比动态配置的高,例如:静态配置设置日志输出总开关为关闭,动态配置设置日志输出使能,日志已经无法输出。
    配置描述如下:
/* Enable log output */
#define RLOG_OUTPUT_ENABLE              1
/* Set log output level, rang: from RLOG_LEVEL_ASSERT to RLOG_LEVEL_VERBOSE */
#define RLOG_OUTPUT_LEVEL               RLOG_LEVEL_VERBOSE
/* Enable log color */
#define RLOG_COLOUR_ENABLE              1
/* Enable log color */
#define RLOG_TIME_ENABLE                1
/* Support log include directory */
#define RLOG_DIRECTORY_ENABLE           1
/* Support log include funtiong name */
#define RLOG_FUNCTION_ENABLE            1
/* Support log include line number*/
#define RLOG_LINE_ENABLE                1
/* Buffer size for every line's log */
#define RLOG_LINE_BUFF_LEN              128
/* Output line number max length */
#define RLOG_LINE_NUM_SIZE              5
/* Output newline sign */
#define RLOG_NEWLINE_SIGN               "\r\n"
/* Enable assert check */
#define RLOG_ASSERT_ENABLE              1
/* Log function. default FDB_PRINT macro is printf() */
#define RLOG_PRINT(...)                 printf(__VA_ARGS__)

在这里插入图片描述

1.3.2 动态配置:
  1. 动态配置采用接口的方式,用户通过调用rlog.h头文件提供的接口设置;
  2. 动态配置的管控权限比静态配置的低,例如:静态配置设置日志输出总开关为关闭,动态配置设置日志输出使能,日志已经无法输出。
**
 * RLog output enable
 * 
 * @param enable true: enable output, false: disable output 
 */
void rlog_enable(bool enable);
/**
 * RLog output color enable
 * 
 * @param enable true: enable output color, false: disable output color
 */
void rlog_color_enable(bool enable);
/**
 * RLog level output format setting
 * 
 * @param level  log level
 * @param format log format
 */
void rlog_level_fmt_set(rlog_lvl_t level, int format);
/**
 * RLog level output format setting
 * 
 * @param level  log level
 * @param format log format
 * 
 * @return result true: supported format, false: unsupported format
 */
bool rlog_level_fmt_get(rlog_lvl_t level, int format);
/**
 * RLog filter the content of the log level
 * 
 * @param level  log level
 */
void rlog_level_filter_set(rlog_lvl_t level);

在这里插入图片描述

1.3.3 Rlog适配

不同平台的适配方式不同,所以为rlog核心层提供了统一的接口,适配接口如下:

static pthread_mutex_t mutex;

void rlog_lock(void)
{
    pthread_mutex_lock(&mutex);
}

void rlog_unlock(void)
{
    pthread_mutex_unlock(&mutex);
}

char *rlog_get_time(void)
{
#define TIME_STR_SIZE       32
    static char time_str[TIME_STR_SIZE] = {0};
    time_t tmp;
    struct tm *timp;

    time(&tmp);   
    timp = localtime(&tmp);

    memset(time_str, 0, TIME_STR_SIZE);
    rlog_snprintf(time_str, TIME_STR_SIZE, "%04d-%02d-%02d %02d:%02d:%02d", 
                                (1900 + timp->tm_year), (1 + timp->tm_mon), timp->tm_mday,
                                timp->tm_hour, timp->tm_min, timp->tm_sec);

    return time_str;
}

void rlog_output(const char *log, uint16_t len)
{
    RLOG_PRINT("%.*s", len, log);
}

void rlog_adapter_init(void)
{
    pthread_mutex_init(&mutex, NULL);
}

void rlog_adapter_deinit(void)
{
    pthread_mutex_destroy(&mutex);
}
1.3.4 Rlog 使用

日志记录方式

…详情请参照古月居

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

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

相关文章

STM32 (1)

1.基本信息 stm32是由ST公司生产的一种32位微控制器(单片机)。 1.1 各种型号 stm32是32位单片机的总称,有多种不同的系列。 32即用32个比特位表示一个地址,寻址范围:0x00000000 --0xffffffff (4GB) 1.2 存储密度 …

本地如何配置支付宝模拟支付场景并结合内网穿透实现公网环境调试开发?

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 前言 在沙箱环境调试支付SDK的时候,往往沙箱环境部署在本地,局限性大,在沙箱环境…

[环境配置]ssh连接报错“kex_exchange_identification: read: Connection reset by peer”

已经被VScode ssh毒死好几次了,都是执行命令意外中断,然后又VSCode里连不上、本机Terminal也连不上了。。。 重启远程服务器,VSCode可以连上了, 系统ssh还是不行,报错“kex_exchange_identification: read: Connecti…

数字化转型对企业有什么意义

降本增效,提高生产力 数字化转型可以引入自动化和智能化技术、帮助企业优化流程、减少人工操作和错误,提高工作效率和生产力。例如,使用机器人流程自动化 (RPA) 可以自动执行重复性任务,使员工能够专注于更具价值的工作。除了通过…

YOLOv5独家原创改进:特征融合涨点篇 | 广义高效层聚合网络(GELAN) | YOLOv9

💡💡💡本文独家改进:即结合用梯度路径规划(CSPNet)和(ELAN)设计了一种广义的高效层聚合网络(GELAN),高效结合YOLOv5,实现涨点。 将GELAN添加在backbone和head处,提供多个yaml改进方法 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现…

5.测试教程 - 进阶篇

文章目录 1.按测试对像划分1.1**界面测试**1.2**可靠性测试**1.3**容错性测试**1.4**文档测试**1.5**兼容性测试**1.6**易用性测试**1.7**安装卸载测试**1.8**安全测试**1.9**性能测试**1.10**内存泄漏测试** 2.按是否查看代码划分2.1黑盒测试(Black-box Testing)2.2白盒测试(W…

获取properties二个键值对的值

配置文件: 将属性文件中的值赋给Java类的成员变量: 测试方法: GetMapping("/test1") public String test1(String key) {JSONObject jsonUrl JSONObject.parseObject("{"url"}");System.out.println(" …

计算机网络-网络安全(一)

1.网络安全威胁和漏洞类型: 窃听 假冒 重放 流量分析 破环完整 病毒 木马 诽谤 非授权访问 拒绝服务 漏洞:物理、软件、不兼容、其他等。 2.网络安全信息数据五大特征: 完整性&…

四川首例强生全视人工晶体在成都爱尔眼科医院成功植入

【2024年3月1日,成都】全国首批、四川首例强生全视TECNIS Symfony™ Toric IOL植入手术在成都爱尔眼科医院成功开展,手术由爱尔眼科四川省区白内障学组组长、成都爱尔眼科医院副院长巫雷教授执刀。TECNIS Symfony™ Toric IOL的成功运用,不仅…

第二十一周周报

文献阅读:Recent Advances of Monocular 2D and 3D Human Pose Estimation: A Deep Learning Perspective 摘要:在本文中,作者提供了一个全面的 2d到3d视角来解决单目人体姿态估计的问题。首先,全面总结了人体的二维和三维表征。…

思科网络设备监控

思科是 IT 行业的先驱之一,提供从交换机到刀片服务器的各种设备,以满足中小企业和企业的各种 IT 管理需求。管理充满思科的 IT 车间涉及许多管理挑战,例如监控可用性和性能、管理配置更改、存档防火墙日志、排除带宽问题等等,这需…

如何自学python

Python是一种高级编程语言,它具有简单易学、可读性强、可移植性好、功能丰富等优点,因此在许多领域都被广泛使用,如科学计算、数据分析、人工智能、Web开发、游戏开发等等。 Python具有丰富的标准库和第三方库,可以帮助程序员快速开发功能强大的应用程序。同时,Python也具…

2024.02.29作业

1. TCP模型 server #include "test.h"#define SER_IP "192.168.191.128" #define SER_PORT 9999int main(int argc, char const *argv[]) {int sfd -1;sfd socket(AF_INET, SOCK_STREAM, 0);if (-1 sfd){perror("socket error");return -1;…

六、继承(一)

1 继承的引入 以往我们想分别实现描述学生、老师的类,可能会这样子做: class Student {string _name;string _number;int _tel;int id;string _address;int _age; }; class Teacher {string _name;int _level;int _tel;int id;string _address;int _ag…

数据中台:数字中国战略关键技术实施

这里写目录标题 前言为何要建设数据中台数据中台建设痛点数据中台学习资料聚焦前沿,方法论体系更新与时俱进,紧跟时代热点深入6大行业,提炼实践精华大咖推荐,数字化转型必备案头书 前言 在数字中国这一国家战略的牵引下&#xff0…

软考56-上午题-【数据库】-数据库设计步骤2

一、回顾:数据库设计的步骤 1、用户需求分析:手机用户需求,确定系统边界; 2、概念设计(概念结构设计):是抽象概念模型,较理想的是采用E-R方法。 3、逻辑设计:E-R图——…

在四维轻云平台的使用过程中,遇到这些问题应该怎么办?

「四维轻云」是一款轻量化的地理空间数据管理云平台,支持地理空间数据的在线管理、编辑及分享。那么,在四维轻云平台的使用过程中,遇到这些问题应该怎么办? 1、启动插件后,上传界面仍提示“请启动插件” 请先升级插件…

IDEA类和方法注释模板设置

一、概述 IDEA自带的注释模板不是太好用,我本人到网上搜集了很多资料系统的整理了一下制作了一份比较完整的模板来分享给大家,我不是专业玩博客的,写这篇文章只是为了让大家省事。 这里设置的注释模板采用Eclipse的格式,下面先贴…

十五 超级数据查看器 讲解稿 外观设置

十五 超级数据查看器 讲解稿 外观设置 视频讲座地址 讲解稿全文: 大家好,今天讲解超级数据查看器,详情界面的外观设置。 首先,我们打开超级数据查看器。 本节课以成语词典为例来做讲述。 我们打开成语词典这个表,随便选一条记录点击&#x…

导轨安装模拟量直流信号隔离转换放大器0-±5V/0-±10V/0-10V/0-20mA/4-20mA/0-±10mA/0-±20mA

概述: 导轨安装DIN11 IPO EM系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要电量隔离测控的行业。该模块内部嵌入了一个高效微功率的电源&#xff0…