百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

简单到傻瓜都会用的日志库:log.c

yuyutoo 2025-03-04 14:58 4 浏览 0 评论


对于嵌入式底层应用开发,基本离不开日志功能,这种轮子有很多,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(const char *fmt, ...);
log_debug(const char *fmt, ...);
log_info(const char *fmt, ...);
log_warn(const char *fmt, ...);
log_error(const char *fmt, ...);
log_fatal(const char *fmt, ...);

它们都是对 log_log() 的简单封装,用法和 printf() 一样。

示例:

下面的例子会将日志同时输出到标准输出和文件中。

#include "log.h"

int main(int argc, 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);
    return 0;
}

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

点击这里找小助理0元领取嵌入式物联网学习资料(头条)

运行:

$ ./example1 
23:31:05 DEBUG example1.c:20: debug
23:31:05 INFO  example1.c:21: info
23:31:05 WARN  example1.c:22: warn

$ cat log_debug.txt 
2022-05-08 23:31:05 DEBUG example1.c:20: debug
2022-05-08 23:31:05 INFO  example1.c:21: info
2022-05-08 23:31:05 WARN  example1.c:22: warn

$ cat log_info.txt 
2022-05-08 23:31:05 INFO  example1.c:21: info
2022-05-08 23:31:05 WARN  example1.c:22: warn

关于线程安全:

log.c 代码虽然少,但是仍然考虑了线程安全,下面是用法示例。

#include "log.h"

pthread_mutex_t MUTEX_LOG;
void log_lock(bool lock, void *udata);

int main()
{
    log_set_level(0);
    log_set_quiet(0);

    pthread_mutex_init(&MUTEX_LOG, NULL);
    log_set_lock(log_lock, &MUTEX_LOG);

    /* Insert threaded application code here... */
    log_info("I'm threadsafe");

    pthread_mutex_destroy(&MUTEX_LOG);

    return 0;
}

void log_lock(bool lock, 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 是一个函数指针:。

typedef void (*log_LockFn)(bool lock, void *udata);

用户可以用它来指定自己想用的锁机制,例如 Pthread 的互斥量。

int level 用于保存当前的 log 等级,等级大于 level 的 log 才会被输出到标准输出。

bool quiet 用于打开、关闭 log 输出。

数组 callbacks 用于保存多种输出方式,目前仅支持输出到标准输出和文件,有需要的话我们还可以将其扩展成输出到 syslog、网络等,每增加一种输出方式就是构造一个 Callback,成员回调函数 log_LogFn 负责真正地 log 输出功能:

typedef void (*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。

转载自:老吴嵌入式

文章来源于简单到傻瓜都会用的日志库:log.c

原文链接:
https://mp.weixin.qq.com/s/CQI7c9SUZOeBT1MVfIWCZw

相关推荐

像这样即能找勾又能打×的下拉菜单,您知道是怎么做的吗?

您知道像这样既能打勾又能打叉的下拉菜单怎么制作吗?比如这是一个考勤表,今天没有来,可以用叉看下拉菜单一个叉,然后这天到了打勾。怎么制作?·第一步,选中要制作的下拉菜单的单元格。·第二步,选择数据菜单里...

Axure教程:制作下拉选择框部件的联动效果

本文通过一个相对简单的示例,介绍了如何制作下拉选择框的联通效果。产品经理在制作产品原型的过程中,经常会遇到部件间联动的效果设计。如果不能通过原型交互方式来完成,则会以“静态页面+文字说明+步骤指引”的...

Excel技巧:最简单的制作下拉列表的方法

在制作报表的时候,经常会输入一些重复性的内容。这时候使用下拉列表直接选择,就可以简化重复输入的操作,不用费时费力地复制粘贴,同时录入信息页更加准确。示例图:操作步骤:...

下拉刷新之后,为什么我惊呆了?

2009年LorenBrichter在Tweetie2中首创了PullDowntoRefresh「下拉刷新」的交互方式,现在这一创举早已成为了各种Feed类应用的标准配置。虽...

每天进步一点点——excel如何设置下拉选项

excel在数据录入的时候,有时候为了方便,不逐条手打,我们常会设置一个下拉选项,直接进行选择。比如性别的录入,就可以偷懒,直接手动选择,比一个个打字要快。最简单下拉选项(以录入性别为例子)第一步,我...

EXCEL表格常用 下拉序号的三种方法 三分钟学会这些方法 详细教程

下拉序号三种方法做表格输入序列号是常有的事,正因为经常输入,我们不好一个一个的去输入,那样太累了。假如有100个序号,我们从一输入到100,会很累的。下面我们学习一下三种输入序号的方法:...

3种方法教你制作Excel中“下拉菜单”

在Excel中,我们经常会面对有很多的数据需要录入,尤其是一些重复的数据。那如何才能解决这个令我们头疼的问题呢,这就是我今天要介绍的下拉菜单的制作。...

表格自动新增下拉选项,Ctrl+T解决重复设置难题,80%人都碰到过

为了方便进行数据输入、汇总及统计,规范我们的Excel表格格式,我们在工作中经常会对单元格进行数据有效性设置,这样可以限定单元格根据下拉选项进行填写内容,让大家按照统一的规范进行输入。如上图所示,我们...

Excel制作搜索式下拉菜单,1条公式,2步搞定

下拉菜单在数据录入的时候,可以提升工作效率,但是如果下拉菜单数据太多的时候,也不好进行选择,我们可以制作成可以搜索的下拉菜单,先输入一个关键字,然后再次进行选择效果如下所示:制作的方法其实很简单,只需...

快速下拉,特别适用于要拉的手断的那种大量数据情况。

办公小技巧:制作更炫酷的Excel下拉菜单

在Excel中制作下拉菜单,大都是利用数据有效性,再有就是表单控件中的组合框。数据有效性或表单控件组合框制作下拉菜单,快捷、便利、实用、功能很全面,但也有力所不及的地方,比如设置下拉菜单的字体、颜色、...

Excel制作智能模糊搜索下拉菜单,1条公式搞定

我们有一列数据,想制作成下拉菜单,然后输入部分关键字,就可以模糊搜索符合条件的值,提供对应的下拉菜单供我们选择,效果如下所示:1、WPS中的EXCELWPS关于下拉菜单,已经做到了智能搜索,所以只需要...

负面下拉词:深入解析与应对策略

你要写负面下拉词,就不能只写负面下拉词。要写信息时代的暗流涌动,数据洪流中潜藏的危机与机遇;要写算法逻辑的冷酷无情,如何在用户行为与数据驱动下,悄然形成负面印象的漩涡;要写品牌与个人的挣扎与抗争,如何...

制作Excel下拉菜单,源数据更新,无需重新设置

在做表格数据录入工作的时候,一方面需要提升数据录入的效率,也需要防止数据录入出错,因此我们会对数据区域设置下拉菜单,从下拉选项中选择我们需要的数据进行录入1、下拉菜单基本设置首先我们要准备下拉菜单的数...

制作2级联动下拉菜单,1分钟搞定,快来学吧!

数据录入的时候,经常需要用到两级下拉菜单,并且需要联动,输入完第一级内容之后,第二级的内容是对应的效果如下所示:制作过程也非常简单,只需要几步就可以完成1、准备数据源第一行中的数据,输入一级下拉菜单中...

取消回复欢迎 发表评论: