0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

调试神器--Rlog

Rice嵌入式开发技术分享 来源:Rice 嵌入式开发技术分享 作者:Rice 嵌入式开发技 2023-08-21 17:17 次阅读

概述

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

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

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

故障排除与问题定位:当应用程序出现问题时,日志可以提供关于发生了什么、在哪里发生以及为什么发生的关键信息,帮助开发人员快速定位和解决问题。

性能分析:通过记录关键操作的时间戳和执行时间,开发人员可以分析应用程序的性能瓶颈,并进行优化。

监控与报警:监控系统可以分析日志,实时监控应用程序的健康状态。当出现异常情况时,可以触发报警机制,使团队可以及时采取措施。

安全审计:记录安全相关事件和访问,以便进行后续的审计和分析。

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

日志级别与分类:日志级别包括调试(Debug)、信息(Info)、警告(Warning)、错误(Error)等。不同级别的日志用于不同目的,例如调试时使用调试日志来追踪代码执行,而错误日志用于记录严重的问题。选择合适的日志级别可以避免日志信息过于冗杂或过于稀少。

日志格式与结构:一个良好的日志格式应包括时间戳、日志级别、模块/组件名以及具体的日志消息。统一的格式使得日志易于阅读和分析。例如:[时间戳] [日志级别] [模块名] - 日志消息

异步日志写入:为避免阻塞应用程序的正常执行,可以采用异步日志写入方式。日志消息被缓冲并在适当的时机写入磁盘,从而提高应用程序的性能。

日志存储与滚动:考虑使用滚动策略,定期归档或删除旧的日志文件,以免日志文件无限增大。选择适当的存储方式,如本地文件、数据库或云存储。

上下文信息:除了基本的日志信息外,还可以在日志中添加上下文信息,如用户ID、请求ID、会话ID等。这些信息有助于在复杂的分布式系统中跟踪请求流程。

敏感信息与安全:避免将敏感信息(如密码、API密钥)写入日志。同时,实施权限控制,限制对日志文件的访问,确保敏感信息不被滥用。

日志分析与可视化:利用日志分析工具或平台,对日志进行聚合、搜索和可视化分析。这有助于发现模式、趋势以及潜在问题。

Rlog组件

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

纯C语言开发:Rlog完全由C语言编写,因此具有广泛的可移植性和兼容性。它可以轻松地集成到各种C语言项目中。

简单的接口:Rlog提供了简单、直观的接口,使开发人员可以轻松地在代码中插入日志记录语句。这使得调试和问题定位变得更加容易。

灵活可配置:Rlog允许开发人员根据项目需求进行高度自定义的配置。您可以定义日志级别、格式、输出位置等,以满足不同应用场景的需求。

插件扩展:一个突出的特点是Rlog的插件式扩展输出端点的能力。这意味着您可以将日志消息输出到各种不同的地方,如文件、终端、远程服务器等,以适应多样化的需求。

Rlog特性

支持用户自定义输出端点(例如:串口终端、网络中断、Flash...),输出端点以插件形式自定义扩展。

日志内容可包含日志等级、时间戳、行号,函数信息,文件信息;

支持多种操作系统RT-ThreadLinux...),也支持裸机平台;

日志输出支持: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灵活配置

静态配置:

静态配置采用宏定义的方式,用户可直接修改rlog_adapter.h头文件的宏定义,就可以修正相关配置;

静态配置的管控权限比动态配置的高,例如:静态配置设置日志输出总开关为关闭,动态配置设置日志输出使能,日志已经无法输出。

配置描述如下:

/*Enablelogoutput*/ #defineRLOG_OUTPUT_ENABLE1 /*Setlogoutputlevel,rang:fromRLOG_LEVEL_ASSERTtoRLOG_LEVEL_VERBOSE*/ #defineRLOG_OUTPUT_LEVELRLOG_LEVEL_VERBOSE /*Enablelogcolor*/ #defineRLOG_COLOUR_ENABLE1 /*Enablelogcolor*/ #defineRLOG_TIME_ENABLE1 /*Supportlogincludedirectory*/ #defineRLOG_DIRECTORY_ENABLE1 /*Supportlogincludefuntiongname*/ #defineRLOG_FUNCTION_ENABLE1 /*Supportlogincludelinenumber*/ #defineRLOG_LINE_ENABLE1 /*Buffersizeforeveryline'slog*/ #defineRLOG_LINE_BUFF_LEN128 /*Outputlinenumbermaxlength*/ #defineRLOG_LINE_NUM_SIZE5 /*Outputnewlinesign*/ #defineRLOG_NEWLINE_SIGN"rn" /*Enableassertcheck*/ #defineRLOG_ASSERT_ENABLE1 /*Logfunction.defaultFDB_PRINTmacroisprintf()*/ #defineRLOG_PRINT(...)printf(__VA_ARGS__)

描述
RLOG_OUTPUT_ENABLE rlog日志输出总开关
RLOG_OUTPUT_LEVEL rlog日志输出等级总开关
RLOG_COLOUR_ENABLE rlog日志等级输出带颜色开关
RLOG_TIME_ENABLE rlog日志等级输出带时间开关
RLOG_DIRECTORY_ENABLE rlog日志等级输出带文件路径开关
RLOG_FUNCTION_ENABLE rlog日志等级输出带函数名开关
RLOG_LINE_ENABLE rlog日志等级输出带行号开关
RLOG_LINE_BUFF_LEN rlog每一条日志最大长度
RLOG_LINE_NUM_SIZE rlog日志等级输出行号的最大长度
RLOG_NEWLINE_SIGN rlog日志换行符格式
RLOG_ASSERT_ENABLE rlog使用assert功能
RLOG_PRINT(...) rlog中断输出设置,如rt-thread采用rt_kprintf, linux采用printf

动态配置:

动态配置采用接口的方式,用户通过调用rlog.h头文件提供的接口设置;

动态配置的管控权限比静态配置的低,例如:静态配置设置日志输出总开关为关闭,动态配置设置日志输出使能,日志已经无法输出。

/** *RLogoutputenable * *@paramenabletrue:enableoutput,false:disableoutput */ voidrlog_enable(boolenable); /** *RLogoutputcolorenable * *@paramenabletrue:enableoutputcolor,false:disableoutputcolor */ voidrlog_color_enable(boolenable); /** *RLogleveloutputformatsetting * *@paramlevelloglevel *@paramformatlogformat */ voidrlog_level_fmt_set(rlog_lvl_tlevel,intformat); /** *RLogleveloutputformatsetting * *@paramlevelloglevel *@paramformatlogformat * *@returnresulttrue:supportedformat,false:unsupportedformat */ boolrlog_level_fmt_get(rlog_lvl_tlevel,intformat); /** *RLogfilterthecontentoftheloglevel * *@paramlevelloglevel */ voidrlog_level_filter_set(rlog_lvl_tlevel);

配置函数 描述
rlog_enable rlog日志输出使能开光
rlog_color_enable rlog日志等级输出带颜色开关
rlog_level_fmt_set rlog日志等级输出格式设置,RLOG_FMT_LVL/RLOG_FMT_TAG/RLOG_FMT_TIME/RLOG_FMT_DIR/RLOG_FMT_FUNC/RLOG_FMT_LINE
rlog_level_fmt_get rlog日志等级输出格式获取
rlog_level_filter_set rlog日志等级输出过滤设置

Rlog适配

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

voidrlog_adapter_init(void); voidrlog_adapter_deinit(void); voidrlog_lock(void); voidrlog_unlock(void); char*rlog_get_time(void); voidrlog_output(constchar*log,uint16_tlen);

适配函数 描述
rlog_adapter_init rlog适配层初始化,如端点插件初始化
rlog_adapter_deinit rlog适配层去初始化,如端点插件去初始化
rlog_lock rlog日志锁,为rlog提供线程安全
rlog_unlock rlog日志解锁,为rlog提供线程安全
rlog_get_time rlog日志提供时间
rlog_output rlog日志输出适配接口

linux下的适配方式:

staticpthread_mutex_tmutex; voidrlog_lock(void) { pthread_mutex_lock(&mutex); } voidrlog_unlock(void) { pthread_mutex_unlock(&mutex); } char*rlog_get_time(void) { #defineTIME_STR_SIZE32 staticchartime_str[TIME_STR_SIZE]={0}; time_ttmp; structtm*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); returntime_str; } voidrlog_output(constchar*log,uint16_tlen) { RLOG_PRINT("%.*s",len,log); } voidrlog_adapter_init(void) { pthread_mutex_init(&mutex,NULL); } voidrlog_adapter_deinit(void) { pthread_mutex_destroy(&mutex); }

Rlog验证

rlog验证以linux环境为例,Rlog开源路径:https://gitee.com/RiceChen0/rlog

rlog验证操作流程:

youyeetoo@youyeetoo:~$gitclonehttps://gitee.com/RiceChen0/rlog.git youyeetoo@youyeetoo:~/rlog$make youyeetoo@youyeetoo:~/rlog$./output/rlog_1.0.0 RLogVersion:v1.0.0 RLogAuthor:RiceChen RLogContact:https://gitee.com/RiceChen0/rlog Youyeetoo (2023-08-1518:53:27)[main.cmain:12]I/RLOG:Youyeetoo RLOGHexDump--Title:RLOG,len:9 00000000:596F75796565746F6FYouyeetoo

rlog验证效果:

8925ba2c-4003-11ee-852b-dac502259ad0.png

Rlog总结

rlog提供了简单易用的日志系统,采用插件方式,提供灵活的输出端点的设置。

rlog的原型参考了开源项目:https://gitee.com/RT-Thread-Mirror/EasyLogger。

rlog不依赖C库,rlog_utils.c中,重新定义了用到C库接口。接口参考了开源项目:https://gitee.com/RT-Thread-Mirror/rt_vsnprintf_full。

下一步计划:

rlog提供不同场景下的插件,网络中断,文件存储,异步操作。

rlog将提供对应的上位机,上位机功能将集成到RTOOLS中,RTOOLS开源路径:https://gitee.com/RiceChen0/rtools。

89352804-4003-11ee-852b-dac502259ad0.png

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8728

    浏览量

    152109
  • 监控
    +关注

    关注

    6

    文章

    2240

    浏览量

    55408
  • C语言
    +关注

    关注

    180

    文章

    7616

    浏览量

    138007
收藏 人收藏

    评论

    相关推荐

    PCB参数计算神器分享

    提前祝小伙伴们中秋节快乐。今天分享一个PCB计算神器,功能非常齐全。
    发表于 09-09 09:31 1320次阅读

    寝室断电上网神器

    ` 本帖最后由 yiyi200712new 于 2013-5-23 08:26 编辑 寝室断电上网神器:断电后依旧可以给路由器供电、手机充电。。。。板子正面图USB:给手机充电红灯:铅蓄电池欠压
    发表于 05-21 00:43

    直流电机EMI抑制神器

    直流电机EMI抑制神器
    发表于 08-05 16:04

    【NanoPi NEO试用体验】神器开箱详解

    成那么多元器件,免不了过孔走线,元器件排版布局也算合理,总的来说工艺方面也是不错,店家还为每块板子配备了铝制散热片,避免板子过热而缩短使用寿命,确实值得称赞。要调试板子,当然少不了这个神器,串口模块,这个
    发表于 11-01 21:13

    定时浇花神器供电问题

    各位老师好!请教一个问题,我在网上买了一个定时给花浇水的神器,4节7号电池供电。我能否把手机充电器的输出端剪一下,与电池盒连起来供电?这样不用担心电池没电,也节省费用。谢谢!
    发表于 07-28 12:36

    快速开发快应用应该了解的5个神器

    想快速开发快应用?你需要知道这5大神器
    发表于 02-13 10:10

    变量命名神器

    中国程序员开发的神奇网站:变量命名神器
    发表于 05-31 06:44

    串口神器sscom5.13.1资源分享

    在附件中是串口神器sscom5.13.1,大家可以点击下面的下载按钮直接下载
    发表于 11-13 11:01

    NXP电力变换的神器

    其实很早之前在公众号给大家推送过NXP的这个神器,freeMaster,这个工具其实已经好多年了,在最早的飞思卡尔早期就存在,一直是工程师调试电机,电力变换的神器,确实好...
    发表于 09-17 06:48

    如何利用rk3399调试RM500Q模块以便正常拨号上网呢

    按照模块厂家提供的资料添加相关驱动以及配置不再赘述,主要是调试过程中系统层面有一个问题,首先看log:D use-Rlog/RLOG-RIL RILU: find quectel module
    发表于 05-23 11:41

    求款MCU430AFE253读写神器

    求款MCU430AFE253读写神器
    发表于 09-19 13:07

    嵌入式调试神器——MicroLab​使用指南

    全新的串口/网络调试服务及关联模块” “发送历史永久保存及支持别名” “串口/网络动态指令编程” “串口/网络虚拟示波器”
    发表于 05-09 15:09 957次阅读
    嵌入式<b class='flag-5'>调试</b><b class='flag-5'>神器</b>——MicroLab​使用指南

    无所不知的神器构建

    电子发烧友网站提供《无所不知的神器构建.zip》资料免费下载
    发表于 07-04 11:22 0次下载
    无所不知的<b class='flag-5'>神器</b>构建

    如何构建一个高效的日志记录系统 Rlog组件的应用

    Rlog作为一款高性能的纯C语言日志组件,为开发人员提供了一种轻松、灵活且可定制的日志记录解决方案。其简单的接口和插件扩展功能使得它适用于各种不同规模和类型的项目。无论是小型应用程序还是大型系统,Rlog都能为您提供高效的日志记录支持,帮助您更好地理解和管理应用程序的运行
    发表于 08-16 12:45 876次阅读
    如何构建一个高效的日志记录系统 <b class='flag-5'>Rlog</b>组件的应用

    介绍一款基于java的渗透测试神器-CobaltStrike

    Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器
    的头像 发表于 01-16 09:16 1100次阅读
    介绍一款基于java的渗透测试<b class='flag-5'>神器</b>-CobaltStrike