Qt下編寫日誌模組(同時記錄檔名 函式名 行數)

2021-09-24 22:33:23 字數 1874 閱讀 4749

說來慚愧,一直以來,我都是使用乙個單例模式來完成日誌模組,具體操作就是呼叫單例的寫檔案函式,自己編輯日誌內容,記錄在日誌檔案裡。

這種做法不利於查詢除錯。而使用qt內建的qinstallmessagehandler函式,重新編輯除錯函式的輸出內容才是簡單高效的做法。

名字很高大上,其實大家都在使用的qdebug()就是。

qdebug() – 除錯資訊輸出;

qinfo() – 資訊訊息;

qwarning() – 警告訊息和可恢復的錯誤;

qcritical() – 關鍵錯誤和系統錯誤;

qfatal() – 致命錯誤。

一共有五類,用法和qdebug()一致。需要特別說明的只有qfatal(),每當程式執行到這句話時會自動報錯並終止。

乙個工程專案會出現很多的除錯資訊和日誌資訊,供我們查詢除錯,如果能提供資訊所在的檔案、函式和行號,那就太方便了。

下面,我們就可以使用qt內建的qinstallmessagehandler函式在自定義訊息處理,通過各除錯級別的資訊輸出,直接輸出到螢幕並記錄到日誌檔案。

//自定義訊息處理函式

void mymessageoutput(qtmsgtype type, const qmessagelogcontex &context, const qstring &msg)

strmessage = strmsg + strmessage;

//加鎖輸出檔案

static qmutex mutex;

mutex.lock();

qfile file("d:\\log.txt");

qtextstream stream(&file);

stream << strmessage << "\r\n";

file.flush();

file.close();

mutex.unlock();

//同時用系統原來的函式完成輸出列印

if(gdefaulthandler) }

int main(int argc, char **ar**)

介面輸出的內容如下:

this is a debug msg.

this is a info msg.

this is a warning msg.

this is a critical msg.

檔案記錄的內容如下:

debug 2019-07-03 10:59:32 file:…\logmsg\main.cpp line:74 function:int __cdecl main(int,char *)

this is a debug msg.

info 2019-07-03 10:59:32 file:…\logmsg\main.cpp line:75 function:int __cdecl main(int,char *)

this is a info msg.

warning 2019-07-03 10:59:32 file:…\logmsg\main.cpp line:76 function:int __cdecl main(int,char *)

this is a warning msg.

critical 2019-07-03 10:59:32 file:…\logmsg\main.cpp line:77 function:int __cdecl main(int,char *)

this is a critical msg.

release版本預設不包含檔名、函式名和行數資訊,需要在.pro檔案中加入一行**,重新make執行後生效。

defines += qt_messagelogcontext

Python模組學習 logging 日誌記錄

python的logging模組提供了記錄程式運 況的日誌功能,類似於apache的log4j 許多應用程式中都會有日誌模組,用於記錄系統在執行過程中的一些關鍵資訊,以便於對系統的執行狀況進行跟蹤。在.net平台中,有非常著名的第三方開源日誌元件log4net,c 中,有人們熟悉的log4cpp,而...

Mac下 lua C模組的編寫

我們已經看到如何在c檔案中使用lua register註冊lua可以使用的函式,也了解了c函式和lua函式之間如何傳遞引數。再提公升一步,我們還可以將一組c函式組成乙個模組交給lua環境使用。看具體的例子 mylualib.c include include include static int h...

windows下嘗試編寫node模組

1,首先參考寫了乙個模組 2,按照指引執行 f program files nodejs mymodule node gyp configure build 奶奶的,一開始就少了乙個node gyp,上網一艘,原來這也是乙個模組 node gyp 不是內部或外部命令,也不是可執行的程式 或批處理檔案...