天天看點

Linux下一個簡單的日志系統的設計及其C代碼實作

1.概述

在大型軟體系統中,為了監測軟體運作狀況及排查軟體故障,一般都會要求軟體程式在運作的過程中産生日志檔案。在日志檔案中存放程式流程中的一些重要資訊,包括:變量名稱及其值、消息結構定義、函數傳回值及其執行情況、腳本執行及調用情況等。通過閱讀日志檔案,我們能夠較快地跟蹤程式流程,并發現程式問題。是以,熟練掌握日志系統的編寫方法并快速地閱讀日志檔案,是對一個軟體開發工程師的基本要求。

本文詳細地介紹了Linux下一個簡單的日志系統的設計方法,并給出了其C代碼實作。本文為相關開發項目Linux下軟體日志系統的編寫提供了有益的參考。

2.日志系統的架構結構

一個完整的日志系統包括三大部分:配置檔案、軟體程式和日志檔案,它們之間的關系如圖1所示。

Linux下一個簡單的日志系統的設計及其C代碼實作

圖1 一個完整的日志系統的架構結構

從圖1可以看出,軟體程式處于主導地位,它會從配置檔案中讀取相關的配置資訊(這些配置資訊用于控制每條日志資訊的生成樣式),經過處理之後将相關資訊輸出到日志檔案中。

3.生成日志檔案的程式流程

基于日志系統的架構結構,生成日志檔案的程式流程如圖2所示。

Linux下一個簡單的日志系統的設計及其C代碼實作

圖2 生成日志檔案的程式流程

在實際的軟體程式中,為了在程式的不同地方列印不同的日志,要将生成日志的代碼封裝為函數,作為API供程式調用。

如果軟體沒有成功生成日志,那麼就不要讓其繼續執行後續流程,而是要查找問題的原因,直到日志生成正常為止。

4.日志檔案命名及日志資訊格式

對于日志檔案的命名,不同的軟體開發項目有不同的規定。一般說來,日志檔案都是以log作為字尾,如本文中的日志檔案命名為:WriteLog.log。

對于每條日志資訊的格式,對于不同的軟體來說,也會有所不同。在本文中,日志資訊的格式有以下兩種(具體使用哪一種通過配置項決定):

第一種:[日志生成時間][檔案名][函數名][代碼行][日志等級]日志具體資訊

第二種:[日志生成時間][日志等級]日志具體資訊

5.配置檔案說明

本文中使用的配置檔案為Config.ini,它包括了兩部分資訊,如下所示:

其中,“EMPLOYEEINFO”段是指員工資訊,包含員工姓名和員工年齡兩個配置項。程式會将員工姓名和員工年齡讀入,并輸出到日志檔案中。

“LOG”段是指日志資訊,包含日志等級、日志代碼位置辨別和輸出日志檔案的目錄三個配置項。對于“LogLevel”配置項,隻有代碼中日志等級不低于配置值的日志資訊才會被輸出到日志檔案中(例如,LogLevel=4,那麼隻有Fatal、Error、Warn、Info和Trace等級的日志會被輸出到日志檔案中)。“LogPosition”配置項的值用于控制是否在日志檔案中顯示“檔案名/函數名/代碼行數”資訊,1則顯示,0則不顯示。“LogDir”配置項的值表示生成的日志檔案存放的目錄。

6.重要程式流程

(1) 從配置檔案中讀取各個配置項的值

Linux下一個簡單的日志系統的設計及其C代碼實作

圖3 配置檔案讀取操作程式流程

(2) 向日志檔案中寫入日志資訊

該操作的流程如圖4所示。

Linux下一個簡單的日志系統的設計及其C代碼實作

圖4 向日志檔案中寫入日志資訊程式流程

該流程的具體代碼請參考本文附錄中的完整程式代碼中的WriteLogFile函數。

7.程式測試設計及檔案上傳

為了測試本日志系統的功能是否正确,在main函數中設計了以下三類日志資訊:

第一類:列印程式的版本号及編譯時間。

第二類:列印Fatal、Error、Warn、Info、Trace、Debug、All這七個等級的日志各一條。

第三類:調用GetEmployeeInfo函數列印讀取到的員工姓名和年齡。

将本程式“WriteLog.c”上傳到Linux的“/home/zhou/zhouzx/test”目錄下,并在該目錄下建立“etc”和“log”目錄,将配置檔案“Config.ini”上傳到“etc”下。檔案及目錄布局如圖5所示。

Linux下一個簡單的日志系統的設計及其C代碼實作

圖5 檔案及目錄布局

8.代碼編譯及運作

在Linux下使用“gcc -g -o WriteLog WriteLog.c”指令對程式進行編譯,生成“WriteLog”檔案。

下面來運作程式。

(1) 将配置檔案中的各個配置項的值設定如下:

則生成的日志檔案“WriteLog.log”的内容為:

對照配置檔案和日志檔案,我們可以看到,“LogLevel”設定的是為5,是以隻有日志等級不低于5的日志被輸出到了日志檔案中;“LogPosition”設定的是為1,是以在日志檔案中顯示了“檔案名/函數名/代碼行數”的資訊。

(2) 将配置檔案中的各個配置項的值設定如下:

對照配置檔案和日志檔案,我們可以看到,“LogLevel”設定的是為4,是以隻有日志等級不低于4的日志被輸出到了日志檔案中;“LogPosition”設定的是為0,是以在日志檔案中不顯示“檔案名/函數名/代碼行數”的資訊。

為了驗證本日志系統功能的正常與否,要對程式進行多組測試,

9.總結

本文對Linux下一個簡單的日志系統的設計方法進行了詳細的介紹(其C代碼實作請見附錄),代碼中的寫日志相關函數可作為API供其它需要進行類似操作的程式調用。在使用本日志系統的過程中,有以下注意事項:

第一,配置檔案中“LOG”段隻包括了日志等級、日志代碼位置辨別和輸出日志檔案的目錄三個配置項。在實際的軟體開發項目中,還會有更多的配置參數,像存放的日志檔案的最大個數、每個日志檔案的大小門檻值、每個已寫入完成的日志檔案的命名等。可以在本程式的基礎上進一步擴充來實作複雜的日志功能。

第二,本文中對日志資訊的寫入采用的是直接在日志檔案後面追加的方式,是以每次測試之前,要在“log”目錄下删除上一次産生的“WriteLog.log”檔案,否則新的日志資訊會寫入舊的日志檔案中。

第三,由于寫日志函數WriteLogFile的入參較多,每次調用的時候編寫代碼較為繁瑣,是以使用一個宏WRITELOGFILE來代替,且隻需要帶上日志等級和日志消息兩個參數即可,其它的如代碼檔案名、函數名和代碼行數直接使用系統自定義的宏即可。

附錄:完整的程式代碼

本人微信公衆号:zhouzxi,請掃描以下二維碼:

Linux下一個簡單的日志系統的設計及其C代碼實作

繼續閱讀