?

一個輕量高效跨平臺日志系統的設計與實現

2017-11-15 16:44楊善寧
電腦知識與技術 2017年28期
關鍵詞:輕量跨平臺高效

楊善寧

摘要:日志功能被廣泛應用于各種軟件開發領域,尤其是在嵌入式系統,然而提高效率、減少開銷,一直是日志系統的所追求的目標和所面臨的挑戰。文中介紹了一個輕量高效、易于跨平臺的日志系統的設計思路與實現要點,并通過基準對比測試,展示了其在效率和性能上的表現。

關鍵詞:日志系統;嵌入式;輕量;高效;跨平臺

中圖分類號:TP311.5 文獻標識碼:A 文章編號:1009-3044(2017)28-0077-02

Abstract: Logging functionality is widely used in various software development areas, especially, the embedded system. Nevertheless, increasing efficiency and reducing overhead are always the goals that a logging system pursues and the challenges to what it faces as well. This paper represents the design thoughts and implementation techniques of a lightweight, high-efficient and cross-platform logging system, and illustrates the logging efficiency and performance through benchmark test.

Key words: logging system; embedded; lightweight; high-efficient; cross-platform

1 概述

規范與齊全的日志是衡量一個軟件系統質量的重要指標,也是大型軟件系統,尤其是嵌入式系統進行離線分析診斷問題的重要途徑。目前,市場上存在著不少優秀的開源日志系統,例如,使用比較廣泛的有Apache log4cxx,Google logging (Glog)等,但這類開源軟件的框架通常過于龐大復雜,不便于團隊統一規范使用,也不易于跨硬件平臺進行移植;或因兼顧編程開發語言、系統平臺等因素而引入一些額外的開銷,從而導致在性能與效率上有所損失。

在整個軟件系統中,日志系統本質上是起輔助性作用的,所以,應盡可能減少其系統開銷,而提高其效率和吞吐量。尤其在嵌入式開發領域,日志系統的簡潔高效性是一個極為重要的軟件質量指標。除了這里提到的程序代碼的簡潔性與高性能的追求外,在嵌入式開發中,為了確保在不同系統平臺上獲得一致的日志操作體驗,同時也便于一些基于日志的監測與測量分析系統的集成,還需要適當考慮跨平臺的可移植性與可擴展性。

通過以上分析,并結合相關開源日志系統的實現機制的研究,去掉不必要的功能特性和避免一些不優化的實現方式,從簡單易用性、效率和性能方面出發,設計并實現一套簡潔易維護、高效率高性能的跨平臺日志系統。

2 系統功能簡介

設計與開發的日志系統稱為Alog,主要以簡單易用性、高效性、跨平臺可移植性為核心目標,著重為嵌入式軟件項目與開發團隊提供有效統一的日志操作體驗。Alog日志系統包括的主要功能特性有:

1) 根據標簽、嚴重級別來分類寫日志;

2) 日志輸出到控制臺、文件系統、Android logcat;

3) 使用配置文件來控制寫日志的行為;

4) 提供豐富的宏定義以便于寫入特定格式的日志用于監測與測量分析;

5) 支持x86、ARM、Android平臺。

Alog使用C語言printf函數風格的日志函數設計,之所以選擇這樣的設計,而不是使用C++輸入輸出流風格或C#控制臺輸出樣式,是因為考慮到目前在嵌入式軟件項目中,軟件大多是使用C/C++編寫的,通過使用Alog提供的相關宏定義,方便快捷地替換原有日志函數調用,從而使Alog易用性和使用范圍得到提高。

用戶可通過配置文件來設定日志按標簽、嚴重性來決定是否輸出,以及輸出到控制臺或文件等。同時,Alog提供宏以控制輸出為特定格式的日志,便于基于日志的腳本或軟件進行監測與測量等用途。此外,在嵌入式軟件開發中,ARM架構及linux、android系統是極為普遍的,因此,Alog優先提供這方面的跨平臺支持。

3 系統設計

Alog的首要設計目標是精簡輕量、高效高性能,去掉不實用的特性,保留最有價值的功能,從而使得邏輯簡單清晰,不易出錯,并且代碼執行效率高,使得更適用于嵌入式系統的開發。

3.1 功能模塊設計

Alog的功能模塊主要包括API接口層、日志操作主控邏輯、配置文件解析和輸出模塊,其中輸出模塊按照日志輸出目的地不同細分為終端屏幕、文件系統和Android logcat。如下圖1簡要描述了Alog的功能模塊組成。

API接口層主要負責屏蔽內部細節,給上層應用程序提供訪問接口,有利于統一規范地使用日志系統,主要接口包括初始化、關閉日志系統、寫日志、查看運行狀況等,并以C語言宏定義的方式提供常規與特殊用途的日志功能。

Alog配置文件的解析與應用,使到用戶可方便靈活地控制日志的行為:

1) 設置是否打印日志到控制臺屏幕、文件、Android logcat;

2) 設置日志保存路徑、文件名等;

3) 設置默認日志輸出級別,也可設置特定標簽、特定嚴重級別的日志輸出等。

日志主控模塊負責日志的操作行為,實現控制邏輯,格式化日志文本。根據日志中指定的標簽,使用哈希的方法檢索相應配置,快速確定日志的操作行為。endprint

日志輸出模塊將格式化好的日志,輸出到特定的目的地,如磁盤文件、屏幕控制臺等。使用C++面向對象設計,以繼承的方式實現基類聲明的接口,這樣可以更好的復用主控模塊的控制邏輯,只需實現特定的輸出邏輯即可。

3.2 接口設計

Alog使用C/C++編程語言進行開發,以得到良好的運行效率和性能,同時,以動態庫與靜態庫兩種形式對外提供接口,方便用戶靈活使用。為了進一步屏蔽瑣碎的細節,Alog提供C語言宏定義以供外部訪問。其訪問接口主要有兩大類:一類是用于輸出常規的日志,如輸出特定標簽及特定嚴重性級別的日志;一類是用于輸出特定格式的日志,以便使用腳本或軟件對日志進行掃描分析,進行實時監測與性能參數測量等。

4 系統實現

4.1 判斷是否輸出日志

Alog基于標簽與嚴重級別來輸出日志,實現過程中,使用C++標準庫的std::map來關聯標簽與相應的日志操作行為設置,這樣也是為了能夠在運行時動態添加標簽配置項。C++標準庫的std::map內部實現使用的是哈希算法,其查找、插入操作的復雜度均為O(n),具備理想的運行時效。首先,由配置文件解析模塊在程序開始運行時,解析并應用Alog配置,即初始化特定標簽的輸出日志的級別。然后,在運行時,根據標簽名在該std::map中查找,如果不存在相應的配置項,則插入默認級別的配置項,否則,使用查找到的配置項。最后,比較標簽所配置的輸出級別與日志請求的級別,決定是否輸出日志,具體流程如下圖2所示。

4.2 格式化日志文本

Alog的日志由消息頭與消息體兩部分組成。消息頭的格式是固定的,其包含的字段依次是:日期時間,嚴重級別,標簽名,文件名,代碼行號。消息體為用戶指定要輸出的日志消息內容。此外,Alog為支持基于日志進行監測與測量,提供稍微特別的日志格式,其消息頭與普通日志相同,僅在消息體前面,使用固定格式的花括弧號,將用戶指定的日志數據包裝起來。借助于一些腳本或軟件,用戶可以方便地將這些數據進行繪圖并加以展示,然后進行直觀地分析與評測,從而了解系統的運行狀況和變化趨勢。

為提高效率,Alog在格式化日志消息時,代碼實現上,使用棧存儲空間,而不是從系統堆中動態分配內存。很多日志系統使用從堆上動態分配內存的策略,如Glog就是這樣實現的。雖然,從堆上分配存儲可以讓用戶輸出任意長度的日志,但它的效率比不上從??臻g直接分配,而且,系統的日志通常不會太長。相比之下,Alog采用的策略一是從程序棧上分配存儲空間;二是限制日志長度為256字節,這通常已經足夠使用,如果不夠,用戶可以寫兩條日志,而這是極少發生的情況。

4.3 輸出日志

Alog在輸出日志時,根據配置文件來決定日志輸出的目的地,支持輸出到屏幕控制臺、文件、Android logcat。實現時,使用C++繼承與多態特性,在父類中實現公共可復用的代碼邏輯,而子類僅需實現各自特有的部分,并提供必要的接口實現即可。對于屏幕控制臺,使用標準錯誤stderr,這是因為stderr是不進行緩存處理的,可以將日志直接輸出到屏幕以確保正確的順序;對于輸出到日志文件,具體實現時,使用POSIX兼容的標準文件讀寫接口將日志寫入磁盤;對于Android平臺,調用其提供的日志輔助函數,將日志輸出到Android logcat。如下圖3簡要說明日志輸出的類設計。

5 性能對比

日志系統本身不是業務的重點,因此,應該以更少的代價來實現更多的價值,即提供便利而不會帶來過多的系統開銷。無論在設計上還是在實現中,Alog始終以簡潔與高效,并具備必要的跨平臺特性為目標,保持簡單清晰的功能邏輯,運用高效的技術實現細節,從而成為更適合嵌入式開發的日志系統。

為測試Alog的性能,將Google的開源日志系統Glog與Alog進行對比測試。測試環境使用操作系統為linux 3.18,CPU為Qualcomm Snapdragon 820,內存為2GB的DDR3,外部存儲為32GB的Flash。測試用例為使用Glog與Alog分別寫入1000000條特定長度的日志到文件,然后統計寫入每種長度的日志所花費的時間。如下圖4,展示了Glog與Alog性能對比情況:

6 結束語

通過在功能上進行精簡設計,以及在性能上進行優化實現,開發出一個輕量而高效,易于跨平臺的日志系統,能夠被廣泛地應用到各領域的軟件開發,尤其是嵌入式軟件系統的開發。

參考文獻:

[1] 李英軍.設計模式: 可復用面向對象軟件的基礎[M].北京: 機械工業出版社,2000:84-88.

[2] 侯捷. C++標準庫[M].2版.北京: 電子工業出版社,2015.

[3] 黃藝海,胡君.日志審計系統設計與實現[J].計算機工程,2006,33(22):67-68.

[4] 劉思堯,李斌.基于ELK 的電力信息監控日志審計系統實現[J].電腦知識與技術,2016, 12(30):61-64.

[5] 孫李斌,趙明明. 基于Linux的嵌入式日志系統設計與實現[J].電子科學技術, 2017, 4 (3):97-99.

[6] google/glog. Github[EB/OL]. https://github.com/google/glog.endprint

猜你喜歡
輕量跨平臺高效
并繼竿之我見(四)
——輕量竿只有新手才用?
輕量新能源汽車應用開關磁阻電機系統匹配的研究
跨平臺APEX接口組件的設計與實現
我對輕量型并繼竿的看法
提高提問的有效性, 構筑高效的語文課堂
打造務實、創新、高效的語文課堂
基于QT的跨平臺輸電鐵塔監控終端軟件設計與實現
基于OPC跨平臺通信的電機監測與診斷系統
基于B/S的跨平臺用戶界面可配置算法研究
降低車用發動機燃油耗的高強度輕量氣門彈簧
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合