这两天发现一个还不错的开源项目,记录一下学习心得。对于嵌入式底层应用开发,基本离不开日志功能,这种轮子有很多,log.c 最简单,达到了开箱即用的级别。
log.c 是什么?
https://github.com/rxi/log.c 简单地说,log.c 就是一个 C 语言的日志功能模块。点击查看大图log.c 的几个特点:代码简洁,就一个 .c 和 .h 文件,一共 200 行。设计优雅,打印日志的 API 只有 1 个。提供了将 log 输入到不同目标的接口,例如输入到文件。提供了实现线程安全的接口。
log.c 怎么用?
打印日志的 API:log_trace(constchar*fmt,...); log_debug(constchar*fmt,...); log_info(constchar*fmt,...); log_warn(constchar*fmt,...); log_error(constchar*fmt,...); log_fatal(constchar*fmt,...); 它们都是对 log_log() 的简单封装,用法和 printf() 一样。示例:下面的例子会将日志同时输出到标准输出和文件中。
#include"log.h" intmain(intargc,char*argv[]) { log_set_level(0); log_set_quiet(0); FILE*fp1,*fp2; fp1=fopen("./log_info.txt","ab"); if(fp1==NULL) return-1; fp2=fopen("./log_debug.txt","ab"); if(fp2==NULL) return-1; log_add_fp(fp1,LOG_INFO); log_add_fp(fp2,LOG_DEBUG); log_debug("debug"); log_info("info"); log_warn("warn"); fclose(fp2); fclose(fp1); return0; } 运行:
$./example1 2305DEBUGexample1.cdebug 2305INFOexample1.cinfo 2305WARNexample1.cwarn $catlog_debug.txt 2022-05-082305DEBUGexample1.cdebug 2022-05-082305INFOexample1.cinfo 2022-05-082305WARNexample1.cwarn $catlog_info.txt 2022-05-082305INFOexample1.cinfo 2022-05-082305WARNexample1.cwarn 关于线程安全:log.c 代码虽然少,但是仍然考虑了线程安全,下面是用法示例。
#include"log.h" pthread_mutex_tMUTEX_LOG; voidlog_lock(boollock,void*udata); intmain() { log_set_level(0); log_set_quiet(0); pthread_mutex_init(&MUTEX_LOG,NULL); log_set_lock(log_lock,&MUTEX_LOG); /*Insertthreadedapplicationcodehere...*/ log_info("I'mthreadsafe"); pthread_mutex_destroy(&MUTEX_LOG); return0; } voidlog_lock(boollock,void*udata) { pthread_mutex_t*LOCK=(pthread_mutex_t*)(udata); if(lock) pthread_mutex_lock(LOCK); else pthread_mutex_unlock(LOCK); }
log.c 的内部实现?
私有数据结构:点击查看大图全局变量 L 维护了 log.c 所需要的所有信息。void *udata 用于保存用户数据,用户可以将其用作任意用途。lock 是一个函数指针:。typedefvoid(*log_LockFn)(boollock,void*udata); 用户可以用它来指定自己想用的锁机制,例如 Pthread 的互斥量。int level 用于保存当前的 log 等级,等级大于 level 的 log 才会被输出到标准输出。bool quiet 用于打开、关闭 log 输出。数组 callbacks 用于保存多种输出方式,目前仅支持输出到标准输出和文件,有需要的话我们还可以将其扩展成输出到 syslog、网络等,每增加一种输出方式就是构造一个 Callback,成员回调函数 log_LogFn 负责真正地 log 输出功能:
typedefvoid(*log_LogFn)(log_Event*ev); 公共数据结构:点击查看大图一条 log 信息对应一个 log_Event。暴露这个数据结构是为了用户可以编写自己的 log 打印函数 log_LogFn 以输出 log。公共的 API:整个 log.c 其实只提供了一个打印相关的 API:log_log()。log_trace() 等宏只是对 log_log() 的简单封装,这种简洁地设计无论是对库的用户还是对库的开发者而言,都是最幸福的事情。剩下的几个 API 用于控制和功能扩展。log_log() 的实现思路:1> 根据用于提供的 log 信息构造 1个 log_Event。2> 将 log 信息输出到标准输出。3> 遍历所有 log Callback,逐一调用它们的打印函数 log_LogFn。
总结
log.c 代码优雅、设计简洁、功能实用,这对库的用户和库的开发者而言,都是一种幸福。如果你的项目需要一个简单好用的日志功能,可以考虑集成开箱即用的 log.c审核编辑 :李倩
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
嵌入式
+关注
关注
5073文章
19038浏览量
303597 -
开源项目
+关注
关注
0文章
36浏览量
7175
原文标题:调试利器!一款轻量级日志库 log.c
文章出处:【微信号:knifewheat,微信公众号:小麦大叔】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
LOG114的bxl文件转换封装出错是哪里的问题?
上面是生成的log.txt文件,不知为何原理图中的引脚数是17而封装的管脚数是21,是官网的封装文件有问题吗?
转换时错误提示:
这是为什么
发表于 09-10 06:31
LOG114开发板能否直接接铟镓砷探测器?
请问LOG114开发板能否直接接铟镓砷探测器,然后测试LOG114的输出。
我想把LOG114的输出直接接到ADC的采集板,ADC是14bits的,用1K的采样频率,请问采样的AD值会不会稳定
发表于 08-05 07:42
LOG114 VLogout输出不正常的原因?
你好,这是我的电路图,目前的问题是VLogout的输出不正常,不服从VLogout=0.375*log(I1/I2)+2.5V。
我之前使用log114芯片的时候,背部的exposed
发表于 08-02 08:02
用U盘记录系统LOG信息的简单步骤和方法
# 01 前言 MCU 组成的系统在实际应用中,经常需要记录系统 LOG 信息,可以是系统不同任务执行情况的 LOG 信息,也可以是内核寄存器等便于维护调试的信息,或者是传感器的信息等。 上述
如何换算LOG200的输入带宽最大范围?
目前我司使用的是AD8305寻求LOG200进行替换,关于LOG200的信息仍然是偏少的,我希望获得更多关于它的信息,主要点是关于带宽的问题,我们的光学系统设计的带宽计算为最高可能达到20MHz
发表于 07-29 07:02
求助,关于log114输入端电流仿真问题求解
我用以下两种方式对log114输入端口输入电流进行仿真,为什么仿真中第一个的输入端口电压会变化而不是保持2V。输入端口R5的阻值10K保持不变,输入端电流IS1变化的时候,log114的输入端的电压也会变化,这是为什么呢
发表于 07-29 06:42
ESP32-C3-MINI-1U模组,U0Tx输出log,不能正常输出低电平是为什么?
原理图设计:
示波器测试到的log输出波形:
原理图设计如上,正常上电输出的log,低电平有0.6-0.7V左右,时常不能正常输出数据,当进入下载固件后,log输出低更是超过1.5V,flash下载工具,无法获取到芯片信息,导致
发表于 07-01 08:24
esp-mdf禁用log输出报错的原因?
因为esp32的三个串口在项目中都占用了,所以要禁用log输出。
通过下面的配置后,编译报错。
错误信息:
esp-mdf/components/mdebug/mdebug_console.c
发表于 06-28 13:22
esp-adf大版本升级到最新,播放音频的log怎么关闭呢?
esp-adf大版本升级到最新,播放音频的log怎么关闭
4976) ADF_BIT_STREAM: length = 960, bytenum = 0, bread = 960
D (4977
发表于 06-28 07:41
ESP32S2关闭ADC/DAC后重启的原因?
)0x400f3601: esp_log_writev at C:/Users/Administrator/Desktop/esp-idf/components/log/log.c:1
发表于 06-20 06:26
ESP32C3编译出现multiple definition of `g_log_level\'的原因?
如题,一个原是ESP32的物联网例程,在改为ESP32C3后,编译出现multiple definition of `g_log_level\'不良。
[2/3] Linking CXX
发表于 06-19 08:28
使用ESP32-S2的TWAI(CAN)功能,开启WIFI连接路由器会重启的原因?
/vprintf.c:34 (discriminator 5)0x4011391d: esp_log_writev at D:/esp-idf/components/log/log.c
发表于 06-14 08:06
如何检查日志中是否有类似cm_cy_log_msg( CYLF_MIDDLEWARE, CY_LOG_ERR) 的内容?
运行,有什么方法可以检查 cm_cy_log_msg 生成的日志? 像这样:
cm_cy_log_msg( CYLF_MIDDLEWARE, CY_LOG_ERR,\"Invalid arguments n\");
任何提示
发表于 05-31 12:45
瑞萨RZ/G2L核心板Linux Log目录文件详解
为了排除系统问题,监控系统健康状况以及了解系统与应用程序的交互方式,我们需要了解各log文件的作用,以G2L中yocto文件系统为例,在系统/var/log/目录下会存放记录系统中各个部分的log文件作用如下:
评论