在介紹 ulog 前,我們先來了解一些日誌的概念:
日誌的定義 :日誌會將軟體運行的狀態、過程等信息,輸出到不同的介質中(例如:文件、控制臺、顯示屏等),並進行顯示和保存。為軟體調試、維護過程中的問題提供追溯、性能分析、系統監控、故障預警等功能,同時提供參考依據。可以說,日誌的使用,幾乎佔用了軟體生命周期至少 80% 的時間。
日誌的重要性 :對於作業系統而言,由於其軟體的複雜度非常大,單步調試在一些場景下並不適合,所以日誌組件在作業系統上幾乎都是標配。完善的日誌系統也能讓作業系統的調試事半功倍。
RT-Thread 一直缺少小巧、實用的日誌組件,而 ulog 的誕生補全了這塊的短板。今天,它將作為 RT-Thread 的基礎組件被開源出來,讓我們的開發者也能用上簡潔易用的日誌系統,提高開發效率。
ulog 介紹ulog 是一個非常簡潔、易用的 C/C++ 日誌組件,第一個字母 u 代表 μ,即微型的意思。它能做到最低 ROM<1K, RAM<0.2K 的資源佔用。ulog 不僅有小巧體積,同樣也有非常全面的功能,其設計理念參考的是另外一款 C/C++ 開源日誌庫:EasyLogger(簡稱 elog),並在功能和性能等方面做了非常多的改進。主要特性如下:
主要特性線程安全日誌輸出被設計為是線程安全的方式,當前線程日誌輸出不會被其他線程打斷幹擾。不用再擔心像使用 rt_kprintf 那樣,多線程並發輸出日誌時,日誌顯示錯位、截斷等問題。
高可靠日誌系統可靠性高,在 中斷 ISR 中、Hardfault 等複雜環境下依舊可用。不僅留給用戶的限制更少,還能夠保證系統在出錯場景下,記錄的日誌依舊準確、全面,成為用戶的調試利器。而這點在其他常見的日誌系統中是做不到的。
後端多樣化ulog 可以將日誌輸出到終端、串口、網絡,文件、快閃記憶體等位置,這些地方在 ulog 裡統稱為後端。ulog 採用了前後端分離式設計,保證了日誌的後端代碼的獨立性以及可擴展性。無論什麼樣的後端,只要實現出來,都可以註冊上去。
當前 ulog 已經集成了兩種後端:
未來還將會有更多的後端加入進來,也期待大家一起參與,實現你們需要的後端,然後分享出來。
支持異步輸出在 ulog 中,默認的輸出模式是同步模式,在很多場景下用戶可能還需要異步模式。用戶在調用日誌輸出 API 時,會將日誌緩存到緩衝區中,會有專門負責日誌輸出的線程取出日誌,然後輸出到後端。
這樣日誌輸出不會阻塞當前線程,日誌調試代碼也就不會影響當前線程運行時序。
靈活的過濾配置以上運行階段的配置也都支持通過 Finsh/MSH 命令進行操作。
兼容 syslogulog 提供了 syslog 模式的支持,不僅僅前端 API 與 syslog API 完全一致,日誌的格式也符合 RFC 標準,更好的兼容了來自 linux 平臺上的軟體代碼。
支持 hexdumphexdump 也是日誌輸出時較為常用的功能,通過 hexdump 可以將一段數據以 hex 格式輸出出來。大致效果如下:
支持浮點數列印這個一直以來都是大家用 rt_kprintf 的痛點,現在在 ulog 上得到了徹底的解決。使用前,需要先在 menuconfig 中配置開啟 ulog 的浮點數支持。
兼容 rtdbg.h 及 elogrtdbg 是 RT-Thread 早期的日誌頭文件,當前 rtdbg 已完成 無縫對接 ulog ,開啟 ulog 後,舊項目中使用 rtdbg 的代碼無需做任何修改,即可使用 ulog 完成日誌輸出。
elog 是 EasyLogger 的簡稱,對於 elog 來說,ulog 能完全做到 API 層面的兼容。使用時,只需要將舊項目原始碼中的 #include <elog.h> 更換為 #include <ulog.h> 即可,其他代碼無需再做任何改動。
使用流程ulog 的代碼目前開源在 RT-Thread 的 GitHub 倉庫中,代碼位於 rt-thread/components/utilities/ulog 下,大致使用流程如下:
#define LOG_TAG "example" //定義當前文件的日誌標籤,不定義默認為:`NO_TAG`
#define LOG_LVL LOG_LVL_DBG //定義當前文件的日誌輸出級別,不定義默認為:調試級別
#include <ulog.h>
/* 使用 ulog API 輸出日誌 */
LOG_D("this is a debug log!");
LOG_I("this is a info log!");
LOG_W("this is a warning log!");
LOG_E("this is a error log!");獲取文檔RT-Thread 為 ulog 組件提供了兩篇應用筆記,從由淺入深的角度幫助大家更好的使用該組件,文檔如下:(以下連結請複製至外部瀏覽器打開)
《RT-Thread ulog 日誌組件應用筆記 - 基礎篇》:https://www.rt-thread.org/document/site/rtthread-application-note/debug/ulog/an0022-rtthread-debug-ulog-basic/
《RT-Thread ulog 日誌組件應用筆記 - 進階篇》:https://www.rt-thread.org/document/site/rtthread-application-note/debug/ulog/an0024-rtthread-debug-ulog-advance/
RT-Thread
讓物聯網終端的開發變得簡單、快速,晶片的價值得到最大化發揮。GPLv2+協議,可免費在商業產品中使用。