首页 > 其他分享 >【嵌入式开发】log.c:一个非常轻量的嵌入式日志库

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

时间:2024-11-27 13:44:55浏览次数:12  
标签:fatal log 嵌入式 日志 ev 轻量 message

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那些事

标签:fatal,log,嵌入式,日志,ev,轻量,message
From: https://www.cnblogs.com/o-O-oO/p/18572176

相关文章

  • 【论文投稿】嵌入式硬件设计 — 智能设备背后的隐形架构大师
     【荣获中国科协认证-品牌会议】第五届机械工程、智能制造与自动化技术国际学术会议(MEMAT2024)_艾思科蓝_学术一站式服务平台更多学术会议论文投稿请看:https://ais.cn/u/nuyAF3目录引言 一、嵌入式硬件设计概述(一)需求分析(二)硬件选型(三)电路设计(四)PCB制作与焊接(五)硬......
  • selenium cookie 登录 转载 from:https://www.cnblogs.com/CYHISTW/p/11685846.html
    seleniumcookie登录 前言爬虫方向的小伙伴们都知道网页爬虫经常遇到的问题就是登录账户,有些简单的网站我们可以简单的sendkey来输入账户密码就可以登录,但是有很多网站需要验证码之类的就不太好用了,这时候就体现到了cookie登录的优点了,前段时间网上搜了搜,发现没有什么完整......
  • 数据库(总结自小林coding)|索引失效的场景、慢查询、原因及如何优化?undo log、redo log
    数据库(总结自小林coding)|索引失效的场景、慢查询、原因及如何优化?undolog、redolog、binlog作用、MySQL和Redis的区别说一下索引失效的场景?什么是慢查询?原因是什么?可以怎么优化?undolog、redolog、binlog有什么用MySQL和Redis的区别是什么说一下索引失效的场景......
  • zblogphp单独调用tag标签(热门tag/随机tag)
    热门tag代码:functionNobird_Theme_Get_nbTags(){global$zbp,$str;$str='';$array=$zbp->GetTagList('','',array('tag_Count'=>'DESC'),array(10),'');foreach($arr......
  • 《安富莱嵌入式周报》第346期:开源2GHz带宽,12bit分辨率,3.2Gsps采样率示波,开源固件安全
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频:https://www.bilibili.com/video/BV1TYBhYKECK/目录:1、开源2GHz带宽,12bit分辨率,3.2Gsps采样率示波器2、开源嵌入式固件安全分析器3、TI分享的8通道隔离±12.288V......
  • 通过并行nologging等快速创建大表备份
    redhat6.5+oracle11.2.0.4rac+96cpu,256g内存[root@dbjyc]#cat20200527.sh #!/bin/shsu-oracle-c"sqlplus/nolog<<EOF@/home/oracle/jyc/20200527.sql;exit;EOF"[root@dbjyc]#cat20200527.sqlsettimeonsettimingonconnuser/passwor......
  • 嵌入式开发之UDP网络编程
    1、TCP编程的函数API1.1、网络发送数据:send()/write()#include<sys/types.h>#include<sys/socket.h>ssize_tsend(intsockfd,constvoid*buf,size_tlen,intflags);#include<unistd.h>ssize_twrite(intfd,constvoid*buf,size_tcount);send()比write多......
  • 嵌入式开发之IO多路复用(一)
    目录1、IO模型和多路复用模型1.1、阻塞I/O模式1.1.1、读阻塞1.1.2、写阻塞1.2、非阻塞模式I/O1.3、信号驱动I/O1.4、多路复用I/O1.4.1、IO多路复用步骤:1.4.2、伪代码示例讲解1、IO模型和多路复用模型在UNIX、Linux下主要有4种I/O模型:阻塞I/O: 最常用非阻塞I......
  • 极智嘉嵌入式面试题及参考答案
    对于交叉编译器的理解交叉编译器是一种在一个计算机平台上为另一个不同架构的计算机平台生成可执行代码的编译器。它在嵌入式系统开发中起着关键作用。从其必要性来看,嵌入式系统通常使用的处理器架构与我们日常使用的PC等通用计算机不同,如ARM、MIPS等。而我们开发嵌入......
  • 【ABAP——DAILOG_1】
    文章目录程序类型Report程序:1类型程序Online程序:M类型程序Online程序的主要对象Screen界面中的事件块(EventBlock)界面中常用关键字程序类型Report程序:1类型程序制作报表,数据列表(DataList)输出Online程序:M类型程序查询数据,录入、修改、删除等ModulePool程......