本文讲述的是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