RT-Thread论坛
直播中

闷~~

10年用户 834经验值
擅长:可编程逻辑
私信 关注
[问答]

ulog_tag_lvl_filter_set()函数无法实现按照文档说明那样实现按模块过滤,怎么解决?

ulog_tag_lvl_filter_set()函数无法实现按照文档说明那样实现按模块过滤,比如过滤掉所有drv.xxx的日志


回帖(1)

郑成枝

2025-10-20 17:04:12

要解决ulog_tag_lvl_filter_set()函数无法按模块(如drv.xxx)过滤日志的问题,可尝试以下方案:


1. 确认通配符支持



  • 问题原因:函数可能不支持直接使用drv.*这样的通配符过滤模块。

  • 解决方案
     // 尝试为每个具体模块单独设置过滤(效率低)
    ulog_tag_lvl_filter_set("drv.uart", ULOG_LVL_NONE);
    ulog_tag_lvl_filter_set("drv.i2c", ULOG_LVL_NONE);
    // ... 添加所有需要过滤的模块


2. 使用自定义过滤器函数


通过添加自定义过滤器实现模块级过滤:


   #include  // for strncmp()

   static int ulog_module_filter(rt_uint32_t level, const char *tag) {
       // 过滤所有以 "drv." 开头的标签
       if (strncmp(tag, "drv.", 4) == 0) {
           return 1; // 返回 1 表示丢弃日志
       }
       return 0;   // 返回 0 表示保留日志
   }

   void setup_log_filter() {
       // 添加自定义过滤器
       ulog_filter_add(ulog_module_filter);
   }

3. 修改全局日志级别(临时方案)



  • 适用场景:若只需完全关闭所有drv.xxx日志且无通配符支持。

  • 步骤

    • 找到模块的日志输出代码(如LOG_D("drv.uart", "message"))。

    • 手动修改每个模块的日志级别:
      #define LOG_TAG              "drv.uart"
      #define LOG_LVL              ULOG_LVL_NONE // 强制关闭该模块日志
      #include



4. 检查 ulog 版本与更新



  • 确认 ulog 是否支持通配符(查阅最新文档或源码)。

  • 若版本过旧,考虑升级:
     # 以 RT-Thread env 工具为例
    pkgs --upgrade


5. 官方反馈与源码修复



  • 若确认是 ulog 的功能缺陷:

    1. 在 RT-Thread GitHub 提交 Issue

    2. 建议源码修复:在ulog_tag_lvl_filter_set()中增加通配符处理逻辑(需修改 ulog 核心代码)。



推荐方案


优先尝试自定义过滤器(方案2),它灵活且无需修改每个模块:


// 添加过滤器后,所有 drv.xxx 日志将被丢弃
setup_log_filter();

此方法在日志输出前直接拦截,高效简洁,适合动态过滤多个模块。



注意ULOG_LVL_NONE 在部分 ulog 版本中可能需替换为 0ULOG_LVL_SILENT,请根据实际宏定义调整。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分