【嵌入式开发】log.c:一个非常轻量的嵌入式日志库

news/2024/11/27 13:37:46/文章来源:https://www.cnblogs.com/o-O-oO/p/18572176

log.c简介

github链接:

https://github.com/rxi/log.c

log.c是一个轻量级的日志库。一个用 C99 实现的简单日志库,这意味着它应该可以在任何支持 C99 标准的平台上编译和运行,如我们的嵌入式系统中。

特点

使用C99标准,适用于嵌入式。
支持静默模式。
支持日志级别设置。
支持ANSI颜色编码。
线程安全设计,允许设置锁机制。

使用示例

log.c log.h 文件添加到项目即可。

log.c 提供了六个宏,对应不同的日志级别:


#include "log.h"int main(void) 
{// 追踪日志log_trace("Trace message: %d", 42);// 调试日志log_debug("Debug message: %s", "This is a debug message");// 信息日志log_info("Info message: %s", "This is an info message");// 警告日志log_warn("Warn message: %s", "This is a warning message");// 错误日志log_error("Error message: %s", "This is an error message");// 致命错误日志log_fatal("Fatal message: %s", "This is a fatal message");return 0;
}

每个宏都接受一个 printf 风格的格式字符串和额外的参数。日志信息会被格式化并输出到 stderr。

设置日志级别

我们可以使用 log_set_level 函数来设置日志级别,低于该级别的日志不会被输出到 stderr。

log_set_level(LOG_ERROR); // 只输出错误和致命错误日志

输出到文件

我们可以使用 log_add_fp 函数,可以将日志输出到文件。

#include "log.h"int main(void) 
{FILE* file = fopen("log.txt", "w");if (file != NULL) {log_add_fp(file, LOG_INFO); // 只输出信息级别以上的日志到文件}// 追踪日志log_trace("Trace message: %d", 42);// 调试日志log_debug("Debug message: %s", "This is a debug message");// 信息日志log_info("Info message: %s", "This is an info message");// 警告日志log_warn("Warn message: %s", "This is a warning message");// 错误日志log_error("Error message: %s", "This is an error message");// 致命错误日志log_fatal("Fatal message: %s", "This is a fatal message");return 0;
}

使用回调函数

我们可以注册一个回调函数来处理日志数据。如设置致命日志级别以上的日志打印按照我们的日志格式来处理,输出详细的日期:


#include "log.h"static const char *s_level_strings[] = {"TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"
};static void my_log_callback(log_Event *ev) 
{char buf[64];buf[strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ev->time)] = '\0';fprintf(ev->udata, "%s %-5s %s:%d: ",buf, s_level_strings[ev->level], ev->file, ev->line);vfprintf(ev->udata, ev->fmt, ev->ap);fprintf(ev->udata, "\n");fflush(ev->udata);
}int main(void) 
{log_add_callback(my_log_callback, stderr, LOG_FATAL); // 只处理警告级别以上的日志// 追踪日志log_trace("Trace message: %d", 42);// 调试日志log_debug("Debug message: %s", "This is a debug message");// 信息日志log_info("Info message: %s", "This is an info message");// 警告日志log_warn("Warn message: %s", "This is a warning message");// 错误日志log_error("Error message: %s", "This is an error message");// 致命错误日志log_fatal("Fatal message: %s", "This is a fatal message");return 0;
}

多线程使用

如果在多线程环境中使用,可以使用 log_set_lock 来设置一个锁函数。

void lock_function(bool lock, void *udata) {if (lock) {// 获取锁} else {// 释放锁}
}log_set_lock(lock_function, NULL);

使用颜色

如果我们希望日志输出带有颜色,可以在编译时定义 LOG_USE_COLOR。如:

gcc log.c test.c -DLOG_USE_COLOR

原创 嵌入式与Linux那些事

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/842269.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day1.了解MarkDown

Markdown学习 标题 三级 四级 +空格+文字=标题 几个#就是几级标题 字体 Hello World! 两边各一个*,斜体 Hello World! 两边各两个*,加粗 Hello World! 两边各三个*,斜体+加粗 Hello World! 两边各两个~~,划去 引用每天学一点,早晚成大佬。 一个箭头符号<或>分割…

kubectl 命令行快速操作

集群安装完成后,查看集群信息 [root@k8s-master1 images]# kubectl version [root@k8s-master1 images]# kubectl cluster-info[root@k8s-master1 images]# kubectl version Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"…

vxe-table grid 分享实现单元格编辑表格表尾合计实时计算

在使用 vxe-grid 时,需要实现表尾合计功能,通过单元格编辑之后,实时自动计算表尾合计的值,自动更新表尾合计数据,实现方式通过监听change 事件,从而实现实时更新合计功能。 官网:https://vxetable.cn可以使用插槽模板,也可以使用配置式,下面是配置式的用法: <temp…

zabbix搭建完,web端显示“zabbix服务器端运行中 不”

abbix搭建完,web端显示“zabbix服务器端运行中 不”如下图: 但是查看服务器的状态是running然后查日志/var/log/zabbix/zabbix-server.log 问过度娘之后,发现需要修改/etc/zabbix/zabbix_server.conf文件,在其中添加:DBSocket=/usr/local/mysql/mysql.sock然后重启还是不行…

在VS Code里写C#

Visual Studio下载安装比较耗时,耗磁盘空间,创建C#工程慢。今天尝试了一下在VS Code里创建C#工程,并且跑起来,体验挺轻量的,后面有小的练习,直接在VS Code里测试,应该有不错的体验。 本文是参考了 Get started with C# and .NET in Visual Studio Code。 步骤: 1. 下载…

python 多进程multiprocessing 内存占用 物理内存 虚拟内存 windows 分析

只有 import time time.sleep(10) 前边加上 from torch.utils.data import Dataset import torch# 检查是否支持 CUDA if torch.cuda.is_available():print("CUDA is available!")print(f"Device count: {torch.cuda.device_count()}")print(f"Curre…

【日记】我得承认,我在看到她消息的一瞬间,确实心跳加速了(2437 字)

正文昨天晚上又去玩儿了一会儿,发现自己的基本功大崩溃。都快忘光了。今天没怎么看书,聊了一会儿天。当然最重要的这个事情之后再说。下午一脸懵地被叫去检查组了。骂得好狠。“客户报过来的资料你们都不看一下的吗?” 内控的那个更年期主管如是说。这个问题是内控部门另一个…

Spring Data JPA自动生成表时列顺序混乱的解决办法(最新版)

最近把Spring Boot的版本升级到了3.3.5,突然发现一个问题:当使用Spring Data JPA自动生成表的时候,所产生的列顺序与Entity类中的变量顺序不一致了。比如,有一个下面这样的Entity: @Data @Entity(name = "t_config") @EntityListeners(AuditingEntityListener.c…

服务器为什么要托管,放在自己公司不行吗?

#服务器#服务器托管是指将服务器设备交由专业的数据中心或托管服务商进行管理和维护,而不是放在自己公司内部。因为放在公司的话,公司自行管理服务器在技术支持、成本投入、安全与稳定性以及扩展性等方面都会存在一定挑战和限制:专业技术支持与维护的挑战公司自行管理服务器…

【小米微电机 CyberGear】 拆解

拆开非转轴输出侧的封盖,露出PCBA。PCBA细节图主控应该是GD32F303RET6,接口时AMASS的XT30(2+2)。 拆下固定PCB的螺丝,可以看到里面的线圈背面细节图:

creo装配状态保存

装配体移动位置后,需要在层中保存状态,不然creo打开装配体后会是未操作之前的状态

calico安装下载

k8s网络插件 1、版本选择 cacli版本对应关系查找。参考:https://blog.csdn.net/LRXmrlirixing/article/details/126648454https://docs.tigera.io/archive/v3.10/getting-started/kubernetes/requirements 本次安装的的k8s版本是v1.14.3,所以可以使用calico v3.10版本。 同样…