首页
/ EasyLogger核心API详解:从入门到精通

EasyLogger核心API详解:从入门到精通

2025-07-09 01:44:45作者:宗隆裙

引言

EasyLogger是一款轻量级、高性能的嵌入式日志系统,其核心API提供了丰富的日志功能和控制选项。本文将全面解析EasyLogger的核心API,帮助开发者更好地理解和使用这一强大的日志工具。

1. 基础API

1.1 初始化与启动

EasyLogger使用前必须进行初始化和启动操作:

ElogErrCode elog_init(void);  // 初始化EasyLogger核心功能
void elog_start(void);        // 启动日志输出

技术要点

  • 初始化操作只需执行一次,通常在程序启动时调用
  • 启动操作必须在初始化后调用,否则日志不会输出
  • 初始化函数返回错误码,可用于检查初始化是否成功

1.2 日志级别系统

EasyLogger采用6级日志级别体系:

级别 标识 描述 典型用途
0 [A] 断言(Assert) 严重错误,程序无法继续运行时
1 [E] 错误(Error) 错误情况,但程序仍可运行
2 [W] 警告(Warn) 潜在问题警告
3 [I] 信息(Info) 重要运行信息
4 [D] 调试(Debug) 调试信息
5 [V] 详细(Verbose) 非常详细的调试信息

1.3 日志输出API

EasyLogger为每个级别提供了三种输出方式:

// 完整形式
#define elog_assert(tag, ...) 
#define elog_error(tag, ...)
// ...其他级别类似

// 简化形式1(需指定TAG)
#define elog_a(tag, ...)
#define elog_e(tag, ...)
// ...其他级别类似

// 简化形式2(使用预定义TAG)
#define log_a(...)
#define log_e(...)
// ...其他级别类似

最佳实践

  1. 在每个源文件顶部定义LOG_TAG:
    #define LOG_TAG "module.submodule"
    #include <elog.h>
    
  2. 使用log_x系列宏简化代码:
    log_i("System initialized");
    log_d("Received packet, len=%d", pkt_len);
    

2. 高级功能API

2.1 断言系统

EasyLogger提供了强大的断言功能:

#define ELOG_ASSERT(EXPR)  // 完整形式
#define assert(EXPR)       // 简化形式

// 设置断言钩子函数
void elog_assert_set_hook(void (*hook)(const char* expr, const char* func, size_t line));

应用场景

  • 参数校验
  • 关键状态检查
  • 内存分配验证

2.2 输出控制

// 全局输出控制
void elog_set_output_enabled(bool enabled);
bool elog_get_output_enabled(void);

// 输出锁控制(用于异常处理)
void elog_output_lock_enabled(bool enabled);

异常处理示例

static void assert_hook(const char* ex, const char* func, size_t line) {
    elog_output_lock_enabled(false);  // 禁用输出锁
    elog_a("system", "Assert failed: %s at %s:%d", ex, func, line);
    while(1);
}

2.3 日志格式定制

// 设置日志格式
void elog_set_fmt(uint8_t level, size_t set);

// 日志颜色控制
void elog_set_text_color_enabled(bool enabled);

格式选项

  • ELOG_FMT_LVL - 日志级别
  • ELOG_FMT_TAG - 标签
  • ELOG_FMT_TIME - 时间
  • ELOG_FMT_P_INFO - 进程信息
  • ELOG_FMT_T_INFO - 线程信息
  • ELOG_FMT_FILE - 文件路径
  • ELOG_FMT_LINE - 行号
  • ELOG_FMT_FUNC - 函数名

配置示例

// 错误日志:显示级别、标签和时间
elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);

// 调试日志:显示除函数名外的所有信息
elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_ALL & ~ELOG_FMT_FUNC);

3. 过滤系统

3.1 基本过滤

// 级别过滤
void elog_set_filter_lvl(uint8_t level);

// 标签过滤
void elog_set_filter_tag(const char *tag);

// 关键词过滤
void elog_set_filter_kw(const char *keyword);

// 综合过滤
void elog_set_filter(uint8_t level, const char *tag, const char *keyword);

过滤规则

  • 级别过滤:只显示等于或高于设定级别的日志
  • 标签过滤:日志标签必须包含过滤标签
  • 关键词过滤:日志内容必须包含关键词

3.2 模块级过滤

void elog_set_filter_tag_lvl(const char *tag, uint8_t level);

特殊级别

  • ELOG_FILTER_LVL_SILENT - 静默(不输出)
  • ELOG_FILTER_LVL_ALL - 输出所有级别

使用示例

// 关闭wifi模块所有日志
elog_set_filter_tag_lvl("wifi", ELOG_FILTER_LVL_SILENT);

// 设置wifi模块只输出警告及以上级别
elog_set_filter_tag_lvl("wifi", ELOG_LVL_WARNING);

4. 输出模式

4.1 缓冲输出模式

void elog_buf_enabled(bool enabled);  // 启用/禁用
void elog_flush(void);               // 刷新缓冲区

特点

  • 减少I/O操作次数
  • 提高日志输出效率
  • 需要手动刷新确保及时输出

4.2 异步输出模式

void elog_async_enabled(bool enabled);  // 启用/禁用

// 获取日志
size_t elog_async_get_log(char *log, size_t size);
size_t elog_async_get_line_log(char *log, size_t size);

应用场景

  • 实时性要求高的系统
  • 需要减少日志输出对主程序影响的场景
  • 多线程环境

结语

EasyLogger通过这套精心设计的API,为嵌入式系统提供了强大而灵活的日志功能。从基本的日志输出到高级的过滤和控制功能,EasyLogger能够满足各种复杂的日志需求。合理利用这些API,可以显著提高嵌入式系统的可调试性和可维护性。

在实际项目中,建议根据具体需求选择合适的日志级别、输出格式和过滤策略,在保证调试便利性的同时,避免日志系统对性能造成过大影响。