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