在介紹 ulog 前,我們先來(lái)了解一些日志的概念:
日志的定義:日志會(huì)將軟件運(yùn)行的狀態(tài)、過(guò)程等信息,輸出到不同的介質(zhì)中(例如:文件、控制臺(tái)、顯示屏等),并進(jìn)行顯示和保存。為軟件調(diào)試、維護(hù)過(guò)程中的問(wèn)題提供追溯、性能分析、系統(tǒng)監(jiān)控、故障預(yù)警等功能,同時(shí)提供參考依據(jù)。可以說(shuō),日志的使用,幾乎占用了軟件生命周期至少 80% 的時(shí)間。
日志的重要性:對(duì)于操作系統(tǒng)而言,由于其軟件的復(fù)雜度非常大,單步調(diào)試在一些場(chǎng)景下并不適合,所以日志組件在操作系統(tǒng)上幾乎都是標(biāo)配。完善的日志系統(tǒng)也能讓操作系統(tǒng)的調(diào)試事半功倍。
RT-Thread 一直缺少小巧、實(shí)用的日志組件,而 ulog 的誕生補(bǔ)全了這塊的短板。今天,它將作為 RT-Thread 的基礎(chǔ)組件被開源出來(lái),讓我們的開發(fā)者也能用上簡(jiǎn)潔易用的日志系統(tǒng),提高開發(fā)效率。
ulog 介紹
ulog 是一個(gè)非常簡(jiǎn)潔、易用的 C/C++ 日志組件,第一個(gè)字母 u 代表 μ,即微型的意思。它能做到最低ROM<1K, RAM<0.2K的資源占用。ulog 不僅有小巧體積,同樣也有非常全面的功能,其設(shè)計(jì)理念參考的是另外一款 C/C++ 開源日志庫(kù):EasyLogger(簡(jiǎn)稱 elog),并在功能和性能等方面做了非常多的改進(jìn)。主要特性如下:
主要特性
線程安全
日志輸出被設(shè)計(jì)為是線程安全的方式,當(dāng)前線程日志輸出不會(huì)被其他線程打斷干擾。不用再擔(dān)心像使用 rt_kprintf 那樣,多線程并發(fā)輸出日志時(shí),日志顯示錯(cuò)位、截?cái)嗟葐?wèn)題。
高可靠
日志系統(tǒng)可靠性高,在中斷 ISR中、Hardfault等復(fù)雜環(huán)境下依舊可用。不僅留給用戶的限制更少,還能夠保證系統(tǒng)在出錯(cuò)場(chǎng)景下,記錄的日志依舊準(zhǔn)確、全面,成為用戶的調(diào)試?yán)鳌6@點(diǎn)在其他常見的日志系統(tǒng)中是做不到的。
后端多樣化
ulog 可以將日志輸出到終端、串口、網(wǎng)絡(luò),文件、閃存等位置,這些地方在 ulog 里統(tǒng)稱為后端。ulog 采用了前后端分離式設(shè)計(jì),保證了日志的后端代碼的獨(dú)立性以及可擴(kuò)展性。無(wú)論什么樣的后端,只要實(shí)現(xiàn)出來(lái),都可以注冊(cè)上去。
當(dāng)前 ulog 已經(jīng)集成了兩種后端:
console 控制臺(tái):即大家常用的 rt_kprintf 輸出的位置;
Flash 存儲(chǔ):該后端已集成到 RT-Thread 的軟件包中,具體位置如下:
未來(lái)還將會(huì)有更多的后端加入進(jìn)來(lái),也期待大家一起參與,實(shí)現(xiàn)你們需要的后端,然后分享出來(lái)。
支持異步輸出
在 ulog 中,默認(rèn)的輸出模式是同步模式,在很多場(chǎng)景下用戶可能還需要異步模式。用戶在調(diào)用日志輸出 API 時(shí),會(huì)將日志緩存到緩沖區(qū)中,會(huì)有專門負(fù)責(zé)日志輸出的線程取出日志,然后輸出到后端。
這樣日志輸出不會(huì)阻塞當(dāng)前線程,日志調(diào)試代碼也就不會(huì)影響當(dāng)前線程運(yùn)行時(shí)序。
靈活的過(guò)濾配置
支持運(yùn)行階段/編譯階段開關(guān)控制全局的日志輸出級(jí)別;
各模塊的日志支持運(yùn)行階段/編譯階段設(shè)置輸出級(jí)別;
日志內(nèi)容支持按關(guān)鍵詞及標(biāo)簽方式進(jìn)行全局過(guò)濾;
以上運(yùn)行階段的配置也都支持通過(guò) Finsh/MSH 命令進(jìn)行操作。
兼容 syslog
ulog 提供了 syslog 模式的支持,不僅僅前端 API 與 syslog API 完全一致,日志的格式也符合 RFC 標(biāo)準(zhǔn),更好的兼容了來(lái)自 linux 平臺(tái)上的軟件代碼。
支持 hexdump
hexdump 也是日志輸出時(shí)較為常用的功能,通過(guò) hexdump 可以將一段數(shù)據(jù)以 hex 格式輸出出來(lái)。大致效果如下:
支持浮點(diǎn)數(shù)打印
這個(gè)一直以來(lái)都是大家用 rt_kprintf 的痛點(diǎn),現(xiàn)在在 ulog 上得到了徹底的解決。使用前,需要先在 menuconfig 中配置開啟 ulog 的浮點(diǎn)數(shù)支持。
兼容 rtdbg.h 及 elog
rtdbg 是 RT-Thread 早期的日志頭文件,當(dāng)前 rtdbg 已完成無(wú)縫對(duì)接ulog ,開啟 ulog 后,舊項(xiàng)目中使用 rtdbg 的代碼無(wú)需做任何修改,即可使用 ulog 完成日志輸出。
elog 是 EasyLogger 的簡(jiǎn)稱,對(duì)于 elog 來(lái)說(shuō),ulog 能完全做到 API 層面的兼容。使用時(shí),只需要將舊項(xiàng)目源代碼中的 #include
使用流程
ulog 的代碼目前開源在 RT-Thread 的 GitHub 倉(cāng)庫(kù)中,代碼位于 rt-thread/components/utilities/ulog 下,大致使用流程如下:
開啟:通過(guò) ENV 工具,在 menuconfig 中的 utilities 菜單下選中 ulog 組件;
使用:可以參考 ulog 的應(yīng)用筆記,ulog 的主要日志 API 非常簡(jiǎn)單,基本用法如下:
#define LOG_TAG "example" //定義當(dāng)前文件的日志標(biāo)簽,不定義默認(rèn)為:`NO_TAG`#define LOG_LVL LOG_LVL_DBG //定義當(dāng)前文件的日志輸出級(jí)別,不定義默認(rèn)為:調(diào)試級(jí)別#include獲取文檔
RT-Thread 為 ulog 組件提供了兩篇應(yīng)用筆記,從由淺入深的角度幫助大家更好的使用該組件,文檔如下:(以下鏈接請(qǐng)復(fù)制至外部瀏覽器打開)
《RT-Thread ulog 日志組件應(yīng)用筆記 - 基礎(chǔ)篇》:https://www.rt-thread.org/document/site/rtthread-application-note/debug/ulog/an0022-rtthread-debug-ulog-basic/
《RT-Thread ulog 日志組件應(yīng)用筆記 - 進(jìn)階篇》:https://www.rt-thread.org/document/site/rtthread-application-note/debug/ulog/an0024-rtthread-debug-ulog-advance/
-
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6892瀏覽量
123742 -
代碼
+關(guān)注
關(guān)注
30文章
4825瀏覽量
69040
原文標(biāo)題:Debug神器 | RT-Thread發(fā)布“超輕量級(jí)“日志組件ulog
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論