2.8 KiB
2.8 KiB
liblog — 异步日志系统 API 参考
模块概述
liblog 是嵌入式装置专用的异步日志系统。支持 INFO/ERROR 两级日志,非阻塞写入。 首次调用自动初始化(pthread_once 懒启动)。控制台支持 ANSI 彩色输出, 文件支持按大小自动轮转。
核心特性:
- 消息池预分配:10000 条消息槽位,运行时零 malloc
- 批量消费:工作线程每次最多取 100 条,批量 I/O 减少系统调用
- 生产者-消费者模型:
log_prt()入队(生产者)→ 工作线程出队写入(消费者) - 文件轮转:单文件超过 10MB 自动重命名为
.1 → .2 → ... → .5
常量与宏
| 宏 | 值 | 说明 |
|---|---|---|
LOG_INFO |
0 | INFO 级别(白色) |
LOG_ERROR |
1 | ERROR 级别(红色) |
LOG_I(fmt, ...) |
— | INFO 便捷宏(自动填充文件名/函数名/行号) |
LOG_E(fmt, ...) |
— | ERROR 便捷宏 |
接口函数
log_init(dir)
int log_init(const char *dir);
手动初始化日志系统(可选)。首次调用 log_prt() 时会自动触发。
dir: 日志目录路径,NULL则默认/tmp/logs- 返回: 0 成功
log_prt(level, file, func, line, fmt, ...)
void log_prt(uint32_t level, const char *file, const char *func,
uint32_t line, const char *fmt, ...);
核心日志函数(非阻塞)。从消息池取空闲块 → 填充时间/来源 → 入队 → 立即返回。
参数:
level:LOG_INFO或LOG_ERRORfile:__FILE__(源文件名)func:__FUNCTION__(函数名)line:__LINE__(行号)fmt, ...: printf 格式化
log_file_on / log_file_off
void log_file_on(void);
void log_file_off(void);
开启/关闭文件写入。默认关闭,通过 log_init() 开启。
log_console_on / log_console_off
void log_console_on(void);
void log_console_off(void);
开启/关闭控制台输出。默认开启。
log_flush(void)
void log_flush(void);
阻塞等待消息队列清空(所有日志写入完成)。
log_cleanup(void)
void log_cleanup(void);
停止工作线程、关闭文件句柄、释放消息池。
使用示例
#include "myLog.h"
int main(void)
{
// 手动初始化(可选),指定日志目录
log_init("/var/log/myapp");
// INFO 日志
LOG_I("系统启动完成, CPU=%.1f%%, MEM=%uMB", 45.2, 128);
// ERROR 日志(红色输出)
LOG_E("通讯超时: channel=%d, addr=%u", 3, 0x01);
// 开关控制
log_console_off(); // 关闭控制台(仅写文件)
LOG_I("仅文件输出");
log_console_on();
// 清理
log_flush();
log_cleanup();
return 0;
}
依赖关系
- 依赖: liblist (消息队列链表), libfunc (进程路径获取)
- 被依赖: 所有需要日志的模块