C 之日誌列印

2021-07-07 10:08:51 字數 2360 閱讀 3186

一、c++日誌輸出到檔案

眾所周知,在c++標準庫中提供了乙個控制台(console)輸出物件——std::cout,程式設計師可以呼叫該物件將需要檢視的內容輸出到控制台。除了std::cout外,c++標準庫還提供了乙個檔案輸出流,程式設計師可以使用它定乙個流物件,如「std::ofstream fout」,並關聯乙個檔案,然後像使用控制台輸出一樣將將需要檢視的內容輸出到檔案。參考《c++ primer plus》第17章。

我們在設計程式的時候,可以借助c++標準庫的檔案流物件,程式執行的日誌輸出到檔案。具體的方法是:1)定義乙個全域性的std::ofstream物件,在main()函式中將它初始化,指定關聯的檔案。然後在其他各個檔案使用extern宣告該物件,並在需要的地方使用該物件;2)設計乙個全域性函式,使用print_log命名空間封裝。這個函式接受乙個「const char *」的引數,在函式再定義乙個臨時的檔案,並將傳遞進來的字串寫入檔案,如下:

void output(const char* log)

這樣,乙個基本的日誌輸出到檔案功能就具備了。此外,我們也可通過debug巨集(比如vs的預處理器定義中就含有「_debug」巨集),選擇在debug時將日誌輸出到console,在release是將日誌輸出到檔案。

二、為日誌新增時間戳

為了方便跟蹤程式執行的狀況,我們需要為每條日誌新增時間戳。具體的方法也有兩種,第一種情況對應上面的全域性檔案流物件,使用log列印巨集進行包裝。第二種是在上面的函式中呼叫系統時間,如下:

void output(const char* log)

此處是通過呼叫windows系統函式,獲得時間戳,也可以應用c++11新增的「chrono庫」來獲取與平台無關的時間戳或者呼叫c/c++的兩個巨集「__date」、「__time__」。參考《深入應用c++11》第6章。此外,在qt中,獲取時間戳的**如下:

qstring current_date_time = qdatetime::currentdatetime().tostring("yyyy-mm-dd hh:mm:ss");

int current_time = qtime::currenttime().msec();

qstring current_date = qstring("(%1 %2)").arg(current_date_time).arg(current_time);

三、新增其他的日誌資訊

除了時間戳,我們可能還關心日誌發生的位置,如檔名、行號、類名和函式名。在此可以參考博文「c/c++語言中特定的巨集」,通過呼叫巨集「__file__」、「__line__」、「__function__」,來自動獲取日誌發生時的位置,而不是採用硬編碼的方式。

對於類名,在qt中可以通過元程式設計的方式獲得,如下:

if (row < 0 || column < 0 || row > 1 || column > 1) {

qwarning("qgridlayout: cannot add %s/%s to %s/%s at row %d column %d",

widget->metaobject()->classname(), widget->objectname().tolocal8bit().data(),

q->metaobject()->classname(), q->objectname().tolocal8bit().data(), row, column);

參考《an introduction to design patterns in c++ with qt》的第12章。繼承自qobject的物件,新增了巨集「q_object」的類,qt會為它生成乙個meta物件,裡面包含了它的類資訊。

四、跨執行緒的日誌同步

兩個執行緒同時輸出日誌的時候,如果採用的是方法一(全域性檔案流物件),容易出現日誌錯亂的情況,特別是一條日誌通過包含多個「《」符合的時候。解決的辦法是新增互斥鎖。當然,最好是採用第二中方法(全域性日誌輸出函式),將日誌組好,在傳參給函式,呼叫函式輸出日誌。

五、改進「一去、二三里的qt日誌輸出到檔案」

參考博文:「qt之日誌輸出檔案」。該博文對qt的日誌輸出介紹的比較詳細,其中主要應用qt的qmessagelogcontext。不足的是:1)缺少毫秒級的時間戳;2)沒用列印函式名和類名;

1,新增毫秒級時間戳,見上文**。

2,在函式調研的地方,使用巨集「__function__」,新增函式名。

3,考慮使用全域性檔案,而不用每次open和close。

NDK開發之日誌列印

要在ndk中列印日誌,只需要以下三步 一 在android.mk中新增以下內容 local ldlibs lm llog 或者local ldlibs l sysroot usr lib llog以上兩行 二選一。注意,這行 要新增在include clear vars 之後,否則沒有效果。比如我有...

C 列印日誌

原理其實很簡單,就是建立資料夾 建立檔案 寫入內容 首先判斷資料夾 檔案是否存在 然後再建立或者追加 不多介紹,直接上 public static void buildlogfile string param filestream fs streamwriter sw if file.exists ...

Objectice C之日誌資訊

objectice c中使用nslog來輸出日誌資訊,在objectice c和c中字串最大的區別就是 fox 與 fox c字串是指向乙個位元組字串的指標,而nsstring字串 以 開頭 是物件。操作c字串的方法是修改每個位元組中儲存的值。nsstring字串是不可變的,你不能訪問每個位元組並編...