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

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

3天内不再提示

log.c是什么?

小麦大叔 来源:小麦大叔 作者:小麦大叔 2022-06-05 14:27 次阅读
这两天发现一个还不错的开源项目,记录一下学习心得。对于嵌入式底层应用开发,基本离不开日志功能,这种轮子有很多,log.c 最简单,达到了开箱即用的级别。

log.c 是什么?


	https://github.com/rxi/log.c 简单地说,log.c 就是一个 C 语言的日志功能模块。2900acd4-e171-11ec-ba43-dac502259ad0.png点击查看大图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 的内部实现?

私有数据结构:293dfd46-e171-11ec-ba43-dac502259ad0.png点击查看大图全局变量 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); 公共数据结构:298ef3cc-e171-11ec-ba43-dac502259ad0.png点击查看大图一条 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,微信公众号:小麦大叔】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LOG200评估模块

    电子发烧友网站提供《LOG200评估模块.pdf》资料免费下载
    发表于 11-09 14:23 0次下载
    <b class='flag-5'>LOG</b>200评估模块

    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 信息,也可以是内核寄存器等便于维护调试的信息,或者是传感器的信息等。 上述
    的头像 发表于 07-31 10:22 628次阅读
    用U盘记录系统<b class='flag-5'>LOG</b>信息的简单步骤和方法

    如何换算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文件作用如下:
    的头像 发表于 12-11 17:34 448次阅读
    瑞萨RZ/G2L核心板Linux <b class='flag-5'>Log</b>目录文件详解