本文講述的是log4cplus日志輸出到qt widget,封裝了serverSocket。
log4cplus支持用戶自定義輸出設備,只需要繼承自Appender,或者Appender子類,並實現append成員方法,然後在
log4cplus初始化成功之後,把自定義輸出設備添加到logger中,當用戶向logger中輸出信息時,logger會遍歷自身的所有輸出設備,
並按輸出設備上的指定格式輸出信息。
log4cplus是線程安全的,因此在多線程下可以放心使用
在小工具編寫的過程中,作者遇到了ESP
Crash問題,在網上了找了好久的資料,也沒搞好,後來當然是解決了,原因:我的小工具是用vs2013寫的,log4cplus庫使用vs2010編
譯的,後來用vs2013編譯了下log4cplus,小工具一切正常;不過log4cplus自帶的事例代碼卻開始crash了(vs2010下正
常),後來網上各種百度、谷歌,發現有的人說這是vs2013的bug,反正是最後也沒解決。
小工具運行流程:啟動小工具,開啟接收遠端連接線程W,這樣不阻塞ui主線程,當接收線程收到遠端連接時,開啟收據接收子線程R,來和遠端交互,每個線程
更新一個widget,當線程W關閉時,關閉掉所有由W創建的子線程R,然後關閉serverSocket。R線程接收的數據使用拋事件的方式傳遞給
widget,當然不是直接拋給widget,而是有一個專門處理事件的線程,接收各種不同的事件,然後通過信號槽,發送到指定窗口,窗口更新到界面上。
效果如圖1所示
圖1主要的類說明:
1、工作者線程,監聽消息事件
class MessageListening : public QThread
2、幫助工作者線程處理業務的對象,用戶監聽客戶端的連接請求
class Work : public QObject
工作者線程
class WorkThread : public QThread
3、工作者線程,監聽消息事件
class MessageListening : public QThread
4、服務器端線程,負責和客戶端進行交互
class ClientThread : public log4cplus::thread::AbstractThread
5、小工具主窗口 負責接收並顯示日志信息
class debugHelper : public QWidget
6、用戶列表,顯示當前連接的用戶+默認+創建的用戶
class CCUserListWidget : public QTreeWidget
7、自定義輸出設備
class CCUIAppender : public ConsoleAppender
8、日志過濾數據源 負責提供給視圖過濾後的數據,數據源來自QStandardItemModel
class CCSortFilterProxyModel : public QSortFilterProxyModel
9、日志窗口 針對每個用戶new一個
class CCLogTableWidget : public QWidget
10、本地日志加載創建 用於比對多個不同來源的日志
class CCLogListWidget : public QWidget