Log4Qt的一个强大之处在于可以把log同时记录到不同地方,可以是文件、终端和数据库等等,这里介绍如何把log4qt的log记录输出到一个窗口,输出到其他地方也类似。 主要是继承Log4Qt::AppenderSkeleton重新实现里面的几个虚函数。 - #ifndef LOGVIEW_H
#define LOGVIEW_H class QTextBrowser; /*! \brief root::LogView \author Wang Bin <[email]wbsecg1@gmail.com[/email]> \version 0.01 \date 2011.08.03 Log信息显示窗口。 */ class LogView : public QWidget { Q_OBJECT LOG4QT_DECLARE_QCLASS_LOGGER public: LogView(QWidget *parent = 0); QTextBrowser *view() const {return mView;} public slots: void appendLog(const QString &pMessage); private: QMutex mMutex; QTextBrowser *mView; }; class LogViewAppender : public Log4Qt::AppenderSkeleton { Q_OBJECT public: LogViewAppender(QObject *pParent = 0); ~LogViewAppender(); signals: void OnMessageAppend(const QString& msg); protected: virtual bool requiresLayout() const; virtual void append(const Log4Qt::LoggingEvent &rEvent); #ifndef QT_NO_DEBUG_STREAM virtual QDebug debug(QDebug &rDebug) const; #endif //QT_NO_DEBUG_STREAM private: LogView *mLogView; }; #endif // LOGVIEW_H
- #include "logview.h"
#include <QtCore/QDebug> #include <QtGui/QTextBrowser> #include <QtGui/QLayout> LogView::LogView(QWidget* parent) :QWidget(parent) { QVBoxLayout *vlayout = new QVBoxLayout; setLayout(vlayout); qRegisterMetaType<QTextCursor>("QTextCursor"); mView = new QTextBrowser(this); vlayout->addWidget(mView); showMaximized(); } void LogView::appendLog(const QString &pMessage) { QMutexLocker lock(&mMutex); //QString msg = pMessage.trimmed(); //mView->append(msg); mView->insertPlainText(pMessage); mView->moveCursor(QTextCursor::End); mView->ensureCursorVisible(); } LogViewAppender::LogViewAppender(QObject *parent) : Log4Qt::AppenderSkeleton(parent),mLogView(NULL) { } LogViewAppender::~LogViewAppender() { if (mLogView) { mLogView->close(); mLogView = NULL; } } bool LogViewAppender::requiresLayout() const { return true; } void LogViewAppender::append(const Log4Qt::LoggingEvent &rEvent) { Q_ASSERT_X(layout(), "LogViewAppender::append()", "Layout must not be null"); QString message(layout()->format(rEvent)); emit OnMessageAppend(message); /*if (!mLogView) { mLogView = new LogView; } mLogView->show(); // mLogView->appendLog(message);*/ } #ifndef QT_NO_DEBUG_STREAM QDebug LogViewAppender::debug(QDebug &rDebug) const { return rDebug.space(); } #endif //QT_NO_DEBUG_STREAM
- bool InitializeLog4QtView(LogView *widget)
{ Log4Qt::Logger *logger = Log4Qt::Logger::rootLogger(); LogViewAppender *viewappender = new LogViewAppender; viewappender->setName("ViewAppender"); Log4Qt::TTCCLayout *viewlayout = new Log4Qt::TTCCLayout(Log4Qt::TTCCLayout::ISO8601); viewlayout->setThreadPrinting(true); viewappender->setLayout(viewlayout); viewappender->activateOptions(); logger->addAppender(viewappender); QObject::connect(viewappender, SIGNAL(OnMessageAppend(QString)), widget, SLOT(appendLog(QString))); return true; } bool FinalizeLog4Qt() { Log4Qt::Logger *logger = Log4Qt::Logger::rootLogger(); logger->removeAllAppenders(); return true; }
|