log.c简介

github链接:

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

MIT license

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");

    return0;
}

每个宏都接受一个 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");

    return0;
}

使用回调函数

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

#include "log.h"

staticconstchar *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");

    return0;
}

多线程使用

如果在多线程环境中使用,可以使用 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

图片

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐