設計log函式庫的幾個要點

2021-04-12 19:56:22 字數 2018 閱讀 8450

只要留意一下大專案的原始碼,你會發現,幾乎無一例外的包括乙個

log模組。它的功能很直觀:記錄一些程式執行時資訊,多數情況是用來輔助

debug

的。大專案都有一套的

log的函式,在它的基礎上開發,呼叫它提供的

log函式就行了,比如

linux

核心、apache

等。也有開源

log函式庫,可以直接拿過用。這裡,我們並不鼓勵重新發明輪子,但在少數情況下,確實不得不編寫自己的

log函式。下面是對以前的經驗的總結,和大家交流一下。 1.

按重要程度過濾

loglog

是有代價的,它不但要占用空間,還要占用執行時間。我們不希望在

release

版本中有太多的

log資訊,那會浪費使用者的資源。通常的做法是,把

log資訊按重要程度分成不同的種類,在不同的情況下,列印不同種類的資訊。錯誤的種類,一般分為嚴重錯誤、錯誤、警告、除錯等幾個級別。 2.

按模組過濾

log。對於大的專案的,可能由數十個甚至上百個模組組成。完成乙個複雜的任務,需要在不同模組間切換好幾次,得到的

log資訊比較龐雜。多數情況下,我們的注意力,都放在幾個容易出錯的焦點模組上,

log資訊太雜,要找出焦點模組中的

log會比較累,輸出無用的

log也會增加系統的開銷。這時,我們可以按模組過濾,只留下所關注模組的

log。可以設定乙個過濾掩碼

(mask)

,這個模組占用一位,置

1的模組表示打

log開關。 3.

log的格式。

log的格式最好能夠統一起來,讓人感覺比較舒服,檢視時也有個好的心情。同時最好能與偵錯程式配合起來,比如,在

vc中,若按檔名(行號)

: 資訊

的格式輸出,雙擊該資訊,

vc自動跳到列印該

log的**位置。 4.

log的內容。

log的內容並不無固定規則,一般來說,

log提供下列資訊,對除錯會有一些幫助:

a)模組名。

b)列印該

log的位置,如檔名、行號、函式名等。

c)列印該

log的時間。

d)對由多個模組組成的專案,若這些模組又並不同步發布時,版本不匹配會引發一些問題,這就有必要列印出各模組的

build

時間或者版本資訊。 5.

能重定向

log的內容。常見的做法是把

log資訊列印到螢幕上,這也不盡然,特別對於非

pc平台的情況,有的輸出到串列埠,有的儲存到檔案,有的輸出到

socket

,輸出的目標多種多樣。所以,在設計乙個通用的

log函式庫時,最好考慮到這些需求,抽象出一套輸出介面是較為理想的做法。 6.

動態配置

log。若每次配置

log的規則,都要重新編譯程式,這常常是不能接受的。在設計時要考慮提供動態配置功能。動態配置的方法有多種,可以通過命令列引數,可以通過環境變數,可以通過配置檔案,也可以提供乙個設定介面,這要根據具體的情況而定。配置的內容常常包括:過濾級別、模組掩碼、輸出格式和輸出目標等。 7.

常用的巨集。在

c語言中,有幾個巨集,可能對於編寫

log函式庫有用處: a)

__file__

當前檔名。

b)__line__

當前行號。

c)__func__

當前函式,好像新標準才支援。

d)__date__

編譯日期。

e)__time__

編譯時間。 8.

引數可變。一般來說,

log函式的引數都是可以變化的,這很容易實現,

c語言支援引數個數可變的函式。有時,為了方便,會定義一些巨集包裝一下

log函式,可往往不太走運,因為

c語言新標準裡才支援引數可變的巨集,目前常用的

gcc版本都支援,而

vc這個冤大頭卻不支援。若非要使用變參巨集,一定要考慮可以移植性問題。

靜態函式庫與動態函式庫的設計

函式庫存放位置 linux應用程式使用的主要函式均放在 lib和 usr lib目錄下,其中採用 so.命名的是動態函式庫,而以 a方式命名的是靜態函式庫。靜態函式庫的特點 程式所要用到的庫函式 在鏈結時全部被copy到程式中。導致的問題 如果有多個程序在記憶體中同時執行,並且使用了相同的函式庫,那...

tf 函式庫與np 函式庫的轉換

前言 在對演算法模型進行部署的時候,往往需要做一些工作。以xilinx開發板部署tf框架模型為例,首先需要對訓練好的ckpt模型進行freeze得到.pb模型,之後,對其進行量化 編譯生成elf檔案,然後在板卡上通過main.cc函式呼叫pb模型的輸入 輸出節點對網路模型進行計算,注意這裡的計算分為...

Jstl的函式庫

函式描述 fn contains string,substring 如果引數string中包含引數substring,返回true fn containsignorecase string,substring 如果引數string中包含引數substring 忽略大小寫 返回true fn ends...