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

审核编辑 :李倩


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

    关注

    4983

    文章

    18286

    浏览量

    288508
  • 开源项目
    +关注

    关注

    0

    文章

    36

    浏览量

    7098

原文标题:调试利器!一款轻量级日志库 log.c

文章出处:【微信号:knifewheat,微信公众号:小麦大叔】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    瑞萨RZ/G2L核心板Linux Log目录文件详解

    为了排除系统问题,监控系统健康状况以及了解系统与应用程序的交互方式,我们需要了解各log文件的作用,以G2L中yocto文件系统为例,在系统/var/log/目录下会存放记录系统中各个部分的log文件作用如下:
    的头像 发表于 12-11 17:34 219次阅读
    瑞萨RZ/G2L核心板Linux <b class='flag-5'>Log</b>目录文件详解

    ESP32应用教程— SD NAND(记录飞控LOG

    文章目录前言1SDNAND概述2代码说明3记录Log前言本文基于ESP32芯片作为主控制器,测试SDNAND记录飞控Log功能。关于MCU的存储方面,以前基本上用内置的E2PROM,或者是外置
    的头像 发表于 11-30 18:18 474次阅读
    ESP32应用教程— SD NAND(记录飞控<b class='flag-5'>LOG</b>)

    ESP32应用教程— SD NAND(记录飞控LOG

      文章目录   前言   1 SD NAND概述   2 代码说明   3 记录Log   前言   本文基于 ESP32 芯片作为主控制器,测试 SD NAND 记录飞控 Log 功能
    发表于 11-30 18:16

    Log4cpp优势及优点

    1、log4cpp概述 Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下: 提供应用程序运行上下文,方便跟踪调试; 可扩展的、多种方式记录日志,包括
    的头像 发表于 11-09 14:27 274次阅读
    <b class='flag-5'>Log</b>4cpp优势及优点

    一些封装中没有串口,或者串口已经被用作其他用途,要如何输出log

    一些封装中没有串口,或者串口已经被用作其他用途,要如何输出log? 在一些封装中,例如在裸机程序或者嵌入式系统中,因为种种原因,可能不存在串口可以用于输出log。这对于代码调试和问题排查来说
    的头像 发表于 10-31 14:37 280次阅读

    一款新拿到的芯片,没有串口驱动时如何打印log

    一款新拿到的芯片,没有串口驱动时如何打印log? 在嵌入式系统的开发中,打印log是非常重要的一个环节。它能够帮助开发人员了解系统的运行状态、调试程序、排查问题。然而,在一些系统中,特别是一些
    的头像 发表于 10-31 14:37 339次阅读

    基于Rust的Log日志库介绍

    Rust是一门系统级编程语言,因其安全性、高性能和并发性而备受欢迎。在Rust应用程序中,日志记录是一项非常重要的任务,因为它可以帮助开发人员了解应用程序的运行情况并解决问题。Rust的Log库提供
    的头像 发表于 09-19 14:49 2142次阅读

    如何在ROS中检查保存log的文件夹有多大

    检查log文件夹占用空间 roslaunch这个python包还负责检查保存log的文件夹有多大。在ros_comm-noetic-develtoolsroslaunchsrcroslaunch_
    的头像 发表于 09-14 18:07 1148次阅读
    如何在ROS中检查保存<b class='flag-5'>log</b>的文件夹有多大

    感觉学会log,程序就算入门了

    有些log机制在进程重启时,不会重新生成一个日志文件,而是直接在同一个日志文件后面添加日志。或者,有时候同一程序的多个进程同时运行,可能也会写入到同一个日志文件。
    的头像 发表于 08-02 16:39 358次阅读

    高通Camera Log Debug

    logWarningMask=0x00040482 logWarningMask=0x40482 此时log mask 可以使用上面两种,注意,前面的0可以省略,后面的0不可以省略。
    的头像 发表于 07-04 09:54 661次阅读

    PTP Clock Manager for Linux Message Log 手册

    PTP Clock Manager for Linux Message Log 手册
    发表于 07-03 20:29 2次下载
    PTP Clock Manager for Linux Message <b class='flag-5'>Log</b> 手册

    有趣的UVM_LOG用法

    在项目中,一个TB通常是很多人一起开发的,大家或多或少都会往log中打印一些信息(message),方便自己debug。
    的头像 发表于 06-29 10:58 404次阅读

    服务器log日志大,掌握这些可正确快速定位错误!

    针对大量log日志快速定位错误地方
    的头像 发表于 06-05 18:14 437次阅读

    ADS优化时如何改变x轴为log形式

    不好意思打扰了,我的问题如下:优化过程开始后,仿真图像的X轴总是默认为linear线性形式,但我需要X轴为log形式进行优化,请问怎么改变X轴为log形式再开始优化呢?
    发表于 06-05 14:47

    怎样通过MO和MT Log判断是同一通电话呢?

    : 0a3f5015169230c4e985c8377ca33be4   MT端Log   [NW-》MS][P1][S1]INVITE sip:[2408:850D:6C20:5F72:174F:ACFF:17B5:53ED]
    发表于 05-15 17:23