【全网最实用的嵌入式日志神器】uLog——轻量、灵活、上手超快!

 



uLog 是啥?
uLog 就是为资源紧张的单片机、裸机系统准备的日志库。它只用两文件(.h + .c),全 C 写的,几乎没有依赖,跟 Log4j、Log4c 那套概念差不多,却轻得像根羽毛。

小贴士:如果编译时不打开 ULOG_ENABLED,整个库根本不生成代码,省得占用任何空间。


它到底解决了哪些痛点?

传统问题

uLog 的解决方案

日志开销大

只在需要时编译进代码,关闭后 0 负担

日志级别统一难

支持多输出,每个输出自带阈值(CRITICAL/ERROR/…/TRACE)

移植成本高

只依赖 stdio.h、string.h、stdarg.h,几乎所有平台都能跑

调试信息散落

统一的 ulog_level_name()、时间戳等工具函数,信息一目了然


安装 & 上手

  1. 1. 下载源码:git clone https://github.com/rdpoor/ulog.git(或者直接把 ulog.h、ulog.c 拉进项目)

  2. 2. 配置宏:在编译选项里加 -DULOG_ENABLED=1(想省就不加)

  3. 3. 实现日志接收函数

    void my_console_logger(ulog_level_t lvl, const char *msg) {
        printf("%s [%s]: %s\n", get_timestamp(), ulog_level_name(lvl), msg);
    }
  • 4. 初始化 & 订阅

    ULOG_INIT();                       // 必须的初始化
    ULOG_SUBSCRIBE(my_console_logger, ULOG_WARNING_LEVEL); // 只打印 WARN 以上
  • 5. 随手写日志

    ULOG_INFO("系统启动,参数=%d", arg);
    ULOG_ERROR("温度异常:%0.2f°C", temp);
  • 技巧:想把日志写到文件或环形缓冲区,只要再写一个 my_file_logger()、my_ringbuf_logger(),然后 ULOG_SUBSCRIBE 即可,完全解耦。


    优缺点速评

    优点

    缺点

    极度轻量

    :源码不到 2 KB,编译后几乎不占内存

    功能相对单一

    :不提供,需自行实现高级特性(如日志轮转)

    多输出+阈值

    :同一条日志可同时投递到多个渠道

    无内置时间戳

    :需要自行实现 get_timestamp()

    可裁剪

    :宏控制全部代码生成,关闭即 0 体积

    仅 C 语言

    :不直接支持 C++ 的 RAII 风格(但可以封装)

    易调试

    :日志字符串是静态的,省去动态分配

    静态字符串覆盖

    :同一条日志在下一次调用前会被覆盖,指针存储要小心


    总结
    如果你在玩 STM32、ESP32、裸机或任何资源紧张的 MCU,想要一个“随用随开、随关随走”的日志系统,uLog 真是首选。它的设计哲学就是“别让日志抢走你的资源”,而且上手几行代码就能看到效果。缺点也很明确——功能不够丰富,需要自行补齐,但这恰恰也是它轻量的根本原因。总之,想要日志、又怕膨胀,直接把 uLog 拉进来,省事省心。


    项目地址:https://github.com/rdpoor/ulog

     

    发表评论