Log4Qt使用---自定义输出位置

Log4Qt的一个强大之处在于可以把log同时记录到不同地方,可以是文件、终端和数据库等等,这里介绍如何把log4qt的log记录输出到一个窗口,输出到其他地方也类似。
主要是继承Log4Qt::AppenderSkeleton重新实现里面的几个虚函数。
  1. #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




  1. #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




  1. 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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值