github链接:
https://github.com/rxi/log.c
MIT license
log.c是一个轻量级的日志库。一个用 C99 实现的简单日志库,这意味着它应该可以在任何支持 C99 标准的平台上编译和运行,如我们的嵌入式系统中。
特点:
将 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
猜你喜欢:
WiFi6+蓝牙+星闪,三合一开发板,真香!
Github上热门 C 语言项目汇总!
嵌入式,可测试性软件设计!
一些低功耗软件设计的要点!
嵌入式 C 保护结构体的方式
实用 | 10分钟教你通过网页点灯
谈谈嵌入式软件的兼容性!
分享一个嵌入式代码生成器设计思路!