在作設備開發的時候,是否常常存在如下疑問:git
1.在開發過程當中,程序沒有發生崩潰,但在壓力測試過程當中卻發生了崩潰,抓狂崩潰發生在哪?github
2.設備爲什麼不按照設想的情景運行,當時的場景已經沒法復現,抓狂該如何定位問題所在?json
這時候,須要引入日誌系統。函數
而在儀器設備行業,大多數狀況,須要日誌系統,主要存在兩個需求:測試
1。用於追蹤程序崩潰的大體位置spa
2。用於記錄儀器運行過程當中數據調試
(我的認爲目前大型設備基本也只有這兩個需求)日誌
而儀器的日誌特色是:blog
1。數據量不大,一天1~10個G就不少了開發
2。存在多個子系統,須要分系統記錄
3。可以按日期滾動記錄在文件中
4。功能(例如開關)可不斷線實時加載
5。小型化,儘量的小
爲了知足上述需求和特色,開發了日誌庫,源碼地址:GL4A_logger。
目的:
用於工業設備問題追蹤和分析。
用於在運行和調試過程當中,記錄崩潰所在的大體位置。
用於在平常運行過程當中,監控必要的數據。
特色:
記錄時間小於1ms;
實時記錄,可用於崩潰追蹤;
緩衝記錄,可用於記錄平常運行數據;
記錄文件名和行號,並支持格式化輸出;
支持運行過程當中實時重加載配置;
可記錄在控制檯中,自由選擇功能開關;
可記錄在文件中,自由選擇功能開關;
可自由添加組件/模塊,分模塊記錄,模塊可自由開關;
可自由配置日誌等級。
組成:
組件、日誌記錄器、等級
組件可由用戶增刪改,組件可自由開關,若是某個組件關閉,那麼全部其掛載的日誌記錄器均不會對其進行日誌記錄。
日誌記錄器分爲console控制檯日誌記錄、rolling滾動型日誌記錄、daily按天日誌記錄。三種日誌記錄器都可以自由開關,若是某種日誌記錄器被關閉,那麼全部此類型的日誌均不會被記錄。
等級分爲trace和error,其中,error等級用於追蹤崩潰,trace用於平常數據記錄。全部error日誌均會在trace中備份記錄一份,主要用於保持trace數據上下文完整性。
全部配置項均存在config文件夾中的配置文件GL4A_config.cfg中。
結構圖:
基本用法:
{
//引用頭文件
#include "GL4A_user.h"
// 在程序入口處,根據配置文件路徑,初始化日誌庫
eGL4A_init(GL4A_DEFAULT_CONFIG_DIR);
// 在M0組件函數入口處,記錄ERROR,並標識爲 IN(用於定位大體崩潰位置)
GL4A_ERROR_LOG("M0", __F__, __L__, "XXX函數,IN!\n");
// 在中間必要時,記錄 TRACE,用於平常數據記錄
GL4A_TRACE_LOG("M0", __F__, __L__, "記錄數據!\n");
// 在M0組件函數入口處,記錄ERROR,並標識爲 OUT(用於定位大體崩潰位置)
GL4A_ERROR_LOG("M0", __F__, __L__, "XXX函數,OUT!\n");
// 在程序出口處,關閉日誌庫
GL4A_close();
}
注:當程序發生崩潰時,相應函數入口ERROR IN會被記錄,但ERROR OUT不會被記錄,那麼,根據記錄的文件名和行號,便可定位崩潰發生的位置。
在記錄ERROR時,同時會在TRACE中備份記錄一份,用於保持TRACE記錄上下文的完整性。
基本函數
主要包括兩個部分:
GL4A_init——用於初始化日誌庫
GL4A_reloadConfig——用於實時重加載日誌配置文件
GL4A_close——用於關閉日誌庫
GL4A_TRACE_LOG——用於輸出TRACE日誌
GL4A_ERROR_LOG——用於輸出ERROR日誌
loadCfgFileToStruct——用於獲取配置文件結構體
saveCfgFileFromStruct——用於將配置結構體保存到配置文件
genConfigDefault——從新按照默認的配置結構體生成配置文件
TotalCfgInfos——配置結構類,其中包含對配置項的基本操做
注:若是對json格式比較瞭解,可直接對配置文件進行操做
注:具體參見GL4A_user.h中GL4A命名空間,有很是詳盡的註釋