调试神器--Rlog

news2024/11/27 18:47:57

概述

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

为什么需要日志记录系统?

日志是应用程序在运行时生成的文本消息,用于记录关键事件、错误信息、警告以及其他有价值的信息。日志记录系统的作用如下:

  1. 故障排除与问题定位:当应用程序出现问题时,日志可以提供关于发生了什么、在哪里发生以及为什么发生的关键信息,帮助开发人员快速定位和解决问题。
  2. 性能分析:通过记录关键操作的时间戳和执行时间,开发人员可以分析应用程序的性能瓶颈,并进行优化。
  3. 监控与报警:监控系统可以分析日志,实时监控应用程序的健康状态。当出现异常情况时,可以触发报警机制,使团队可以及时采取措施。
  4. 安全审计:记录安全相关事件和访问,以便进行后续的审计和分析。

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

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

Rlog组件

Rlog作为一款高性能的纯C语言日志组件,为开发人员提供了一种轻松、灵活且可定制的日志记录解决方案。其简单的接口和插件扩展功能使得它适用于各种不同规模和类型的项目。无论是小型应用程序还是大型系统,Rlog都能为您提供高效的日志记录支持,帮助您更好地理解和管理应用程序的运行状态。

  1. 纯C语言开发:Rlog完全由C语言编写,因此具有广泛的可移植性和兼容性。它可以轻松地集成到各种C语言项目中。
  2. 简单的接口:Rlog提供了简单、直观的接口,使开发人员可以轻松地在代码中插入日志记录语句。这使得调试和问题定位变得更加容易。
  3. 灵活可配置:Rlog允许开发人员根据项目需求进行高度自定义的配置。您可以定义日志级别、格式、输出位置等,以满足不同应用场景的需求。
  4. 插件扩展:一个突出的特点是Rlog的插件式扩展输出端点的能力。这意味着您可以将日志消息输出到各种不同的地方,如文件、终端、远程服务器等,以适应多样化的需求。

Rlog特性

  1. 支持用户自定义输出端点(例如:串口终端、网络中断、Flash…),输出端点以插件形式自定义扩展。
  2. 日志内容可包含日志等级、时间戳、行号,函数信息,文件信息;
  3. 支持多种操作系统(RT-Thread、Linux…),也支持裸机平台;
  4. 日志输出支持:printf原始格式,日志等级输出,hexdump输出;

Rlog目录结构

.
├── 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库接口 */

Rlog灵活配置

  • 静态配置:
  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__)
描述
RLOG_OUTPUT_ENABLErlog日志输出总开关
RLOG_OUTPUT_LEVELrlog日志输出等级总开关
RLOG_COLOUR_ENABLErlog日志等级输出带颜色开关
RLOG_TIME_ENABLErlog日志等级输出带时间开关
RLOG_DIRECTORY_ENABLErlog日志等级输出带文件路径开关
RLOG_FUNCTION_ENABLErlog日志等级输出带函数名开关
RLOG_LINE_ENABLErlog日志等级输出带行号开关
RLOG_LINE_BUFF_LENrlog每一条日志最大长度
RLOG_LINE_NUM_SIZErlog日志等级输出行号的最大长度
RLOG_NEWLINE_SIGNrlog日志换行符格式
RLOG_ASSERT_ENABLErlog使用assert功能
RLOG_PRINT(…)rlog中断输出设置,如rt-thread采用rt_kprintf, linux采用printf
  • 动态配置:
  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);
配置函数描述
rlog_enablerlog日志输出使能开光
rlog_color_enablerlog日志等级输出带颜色开关
rlog_level_fmt_setrlog日志等级输出格式设置,RLOG_FMT_LVL/RLOG_FMT_TAG/RLOG_FMT_TIME/RLOG_FMT_DIR/RLOG_FMT_FUNC/RLOG_FMT_LINE
rlog_level_fmt_getrlog日志等级输出格式获取
rlog_level_filter_setrlog日志等级输出过滤设置

Rlog适配

  • 不同平台的适配方式不同,所以为rlog核心层提供了统一的接口,适配接口如下:
void rlog_adapter_init(void);
void rlog_adapter_deinit(void);
void rlog_lock(void);
void rlog_unlock(void);
char *rlog_get_time(void);
void rlog_output(const char *log, uint16_t len);
适配函数描述
rlog_adapter_initrlog适配层初始化,如端点插件初始化
rlog_adapter_deinitrlog适配层去初始化,如端点插件去初始化
rlog_lockrlog日志锁,为rlog提供线程安全
rlog_unlockrlog日志解锁,为rlog提供线程安全
rlog_get_timerlog日志提供时间
rlog_outputrlog日志输出适配接口
  • linux下的适配方式:
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);
}

Rlog验证

  1. rlog验证以linux环境为例,Rlog开源路径:https://gitee.com/RiceChen0/rlog
  2. rlog验证操作流程:
youyeetoo@youyeetoo:~$ git clone https://gitee.com/RiceChen0/rlog.git
youyeetoo@youyeetoo:~/rlog$ make
youyeetoo@youyeetoo:~/rlog$ ./output/rlog_1.0.0 
RLog Version: v1.0.0
RLog Author: RiceChen
RLog Contact: https://gitee.com/RiceChen0/rlog
Youyeetoo
(2023-08-15 18:53:27)[main.c main:12]I/RLOG: Youyeetoo
RLOG HexDump--Title: RLOG, len: 9
00000000: 59 6F 75 79 65 65 74 6F 6F                       Youyeetoo
  1. rlog验证效果:

Rlog总结

  1. rlog提供了简单易用的日志系统,采用插件方式,提供灵活的输出端点的设置。
  2. rlog的原型参考了开源项目:https://gitee.com/RT-Thread-Mirror/EasyLogger。
  3. rlog不依赖C库,rlog_utils.c中,重新定义了用到C库接口。接口参考了开源项目:https://gitee.com/RT-Thread-Mirror/rt_vsnprintf_full。

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

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

相关文章

AI时代Excel数据分析提升之道

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

Oculus经验记录

它的Unity插件以前的版本V39跟V40有问题。V40最奇葩,inputOVR组件中几乎什么都没有,V39还好,只是OVRcameraRG无法拖动倒inputOVR组件上,因类型差一点点(这个我记得以前自己遇到过,有解决的记录,…

洗眼镜超声波清洗机品牌哪个值得买?眼镜超声波清洗机推荐

现在大部分人都离不开眼镜来辅助我们看远处的东西,不单单是眼镜,现在墨镜的使用量也很大,墨镜可以再太阳大的时候遮挡一下视线,近视眼镜可以辅助那些有近视眼的朋友看到更远处的地方。随着眼镜使用量越来越大,也有很多…

WSL Ubuntu 22.04.2 LTS 安装paddlepaddle-gpu==2.5.1踩坑日记

环境是wsl的conda环境。 使用conda安装paddlepaddle-gpu: conda install paddlepaddle-gpu2.5.1 cudatoolkit11.7 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -c conda-forge 等待安装... 报错处理: (1)PreconditionNotMetError: Cannot lo…

虹科分享 | 2023Gartner®终端安全发展规律周期:AMTD引领未来

导语:在2023年Gartner终端安全发展规律周期中,自动移动目标防御(AMTD)崭露头角,虹科Morphisec被誉为AMTD领域的样本供应商。该周期呈现出终端安全领域的最新创新,旨在帮助安全领导者更好地规划、采纳和实施…

我与COSCon的故事【时光的故事】

曾经 2019年的时候,我还在日本读研究生,做一些物联网 (Internet of Things, IoT) 网络中的底层P2P (Peer to Peer) 通讯仿真模拟。这个方向是新来的Nguyen老师的新方向,它跟计算机强相关,但是很小众,实验室里也没有前辈…

汽车数据安全事件频发,用户如何保护隐私信息?

面对日益增多的汽车数据安全事件,对于广大用户来说,有没有既廉价又安全的解决方案? 频发的汽车数据安全事件 随着汽车“新四化”大潮的来临,汽车用户从电动化、网联化、智能化、共享化中切实体验到了越来越多的便利,各…

spark stream入门案例:netcat准实时处理wordCount(scala 编程)

目录 案例需求 代码 结果 解析 案例需求: 使用netcat工具向9999端口不断的发送数据,通过SparkStreaming读取端口数据并统计不同单词出现的次数 -- 1. Spark从socket中获取数据:一行一行的获取 -- 2. Driver程序执行时&#xff0c…

用CRM系统实现销售目标的步骤

每个销售都要有自己的目标计划,在定销售计划时要把握方面问题,一个严格执行,另一个是可控。明确销售目标后,合理分配时间,运用销售基本工作方法严格把控销售进度。那我们该如何用CRM销售管理系统实现销售目标&#xff…

js面向对象(工厂模式、构造函数模式、原型模式、原型和原型链)

1.封装 2. 工厂模式 function createCar(color, style){let obj new Object();obj.color color;obj.style style;return obj;}var car1 createCar("red","car1");var car2 createCar("green","car2"); 3. 构造函数模式 // 创建…

Mybatis-Plus3.x的使用

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为 简化开发、提高效率而生。 一、引入 创建步骤: 1.创建Spring Boot工程 2.添加依赖 引入 Spring Boot Starter 父工程&am…

小程序开发平台源码系统+内容付费小程序功能 带完整的搭建教程

来喽来喽!今天来给大家分享的是一款小程序开发平台源码系统,这款小程序开发平台的功能很多,本文主要给大家介绍一下内容付费小程序功能。以下是部分核心代码: 系统主要功能如下: 知识付费系统开发的优势。一是提高获取…

《永远的爱犬》The forever dog英文版

爱狗人士必读经典,主页左下角有英文版下载方式 手机可阅读

C++标准模板(STL)- 类型支持 (数值极限,traps,tinyness_before)

数值极限 std::numeric_limits 定义于头文件 <limits> 定义于头文件 <limits> template< class T > class numeric_limits; numeric_limits 类模板提供查询各种算术类型属性的标准化方式&#xff08;例如 int 类型的最大可能值是 std::numeric_limits&l…

ESD静电电压监控系统的作用是什么

ESD静电电压监控系统的作用是实时监测生产环境中的静电电压&#xff0c;及时检测和预防ESD静电电压过高的情况&#xff0c;保护设备和产品的质量&#xff0c;确保生产过程的安全和稳定。 具体来说&#xff0c;ESD静电电压监控系统可以实现以下功能&#xff1a; 实时监测静电电压…

华为云应用中间件DCS系列—Redis实现(社交APP)实时评论

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;应用中间件系列之Redis实现&#xff08;社交APP&#xff09;实时评论 1 什么是DEVKIT 华为云开发者插件&#xff08;Huawei Cloud Toolkit&#xff09;&#xff0…

[科研琐事] 安装服务器的二三事

1. 机柜参数 宽度&#xff1a;一般机器都是符合的&#xff1b; 深度&#xff1a;对应服务器最长的那个边&#xff1b; 厚度&#xff08;高度&#xff09;&#xff1a;1/2/3/4U&#xff0c;就是机柜上写的刻度数字&#xff0c;1U1.75英寸。 1U4.45cm 2U4.45cm * 2 3U4.45cm * …

揭秘OLED透明拼接屏的参数规格:分辨率、亮度与透明度全解析

作为一种新型的显示技术&#xff0c;OLED透明拼接屏在市场中正在迅速崭露头角&#xff0c;有很多知名品牌厂家能设计、开发、生产高品质的显示产品。 如尼伽、起鸿、康视界、LG、YCTIMES、腾裕等&#xff0c;这些品牌在显示技术领域拥有丰富的经验和声誉&#xff0c;以其卓越的…

聚观早报 | 特斯拉发布赛博啤酒套装;小米汽车售价曝光

【聚观365】10月16日消息 特斯拉发布赛博啤酒套装 小米汽车售价曝光 新款Model Y 国内已开启交付 苹果将推出新款 iPad mini / Air 保时捷销量中国区大跌 特斯拉发布赛博啤酒套装 特斯拉在美国市场推出CyberBeerCyberStein限量套装&#xff0c;售价150美元&#xff08;约…

USB PD3.1

目前我们大多数Type-C接口仍然采用的是PD3.0快充协议&#xff0c;按当前用户的使用场景来看功率也完全够用&#xff0c;那么PD3.1快充协议是什么&#xff1f;USB PD3.1到底有没有必要&#xff1f; 不妨我们先了解一下PD3.1: 5月25日&#xff0c;USB-IF协会推出了USB Type-C线…