干货!实施自己的日志系统

在嵌入式应用程序的开发过程中,日志系统非常重要!尤其是在生产过程中偶尔存在与当前执行环境相关的错误时,如果没有日志系统来跟踪问题,则很难重现该问题。

因此,实现自己的日志系统非常有帮助,而且很有必要。

在软件模型中,日志系统通常被编译成库文件。

应用程序直接调用库中提供的API接口函数来记录日志信息。

然后,要实现自己的日志记录系统,您需要处理三个问题:(1)日志记录API函数的设计。

(2)缓存日志信息。

(3)日志信息的持久性,即将其写入本地文件系统。

本文主要解释第一个问题:日志API函数的设计。

首先编写代码:测试知识点1.字符串文字拼接在C语言中,有多种拼接字符串的方法:memcpy,strcpy,strcat,sprintf等。

在代码的第19行中,使用了C语言中的字符串文字拼接的方法,“%s:%d(%s)”格式“” ``这3个字符串被拼接成一个字符串。

添加:在日志记录系统代码中,有些地方需要格式化字符串。

使用sprintf最方便,但效率最低!您还可以使用一些第三方库来实现字符串格式,例如:fmtlib,facebook的愚蠢格式,google的Abseil StrFormat。

当然,最好的方法是自行格式化特定类型的数据,这可以显着提高日志记录系统的吞吐量。

Next本文将讨论代码的这一部分。

2.可变参数每个人都知道printf函数是通过可变参数机制实现的。

变量参数可以如下定义和使用:(1)不带参数名称(2)有参数名称第20行代码使用__VA_ARGS__表示宏定义参数中的三个点(...),它们是变量参数。

假设为“ ##”。

如果您调用:debug2(“ code =%d”,100);此调用没有问题。

如果您调用:debug2(“ hello”);当您在此处调用时,格式后没有任何参数,则会发生编译错误,因为在宏替换后,它变成了printf(“ hello”,),第一个参数后还有一个逗号,因此将报告错误。

如果您调用:debug3(“ hello,world!”);那么就没有问题,因为debug3具有“ ##”在变量参数__VA_ARGS__的前面,当编译器发现未传入任何参数时,它将在格式之后自动删除逗号,因此编译正常。

3.宏定义中的#和###的功能是执行“字符”操作。

预处理期间的宏参数。

例如,“串行化”:##的功能是“胶粘”或“粘贴”。

预处理过程中的两个宏参数。

例如:我想知道本文是否会对您有所帮助?免责声明:本文内容经21ic授权后发布。

版权属于原始作者。

该平台仅提供信息存储服务。

本文仅代表作者的个人观点,并不代表该平台的立场。

如有任何疑问,请与我们联系,谢谢!