QsLog使用
这篇讲qt的日志还是比较好的,可以在自己的函数里面配置这个日志框架实现自己所需的功能。
我接触的项目里面,假如有个函数功能执行错误了,我希望可以快速定位到这个错误,这个时候就需要到了日志,我咨询了有经验的工程师,一般对函数功能出错情况定位有三种:
- 使用try catch语句
- 日志
- QMessagesBox
使用try catch语句大多能捕捉到很多错误,我不太用try catch,这个运行如果有错误就会卡在出错的那一段代码那,不会执行try了而是执行catch内的语句
利用日志,就像开头那样,我给个我的例子,用了一个textborwser和两个按钮控件
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();
public:void initLogger();void destroyLogger();
public slots:void logSlot(const QString &message, int level);private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDir>
#include"Log/include/QsLog.h"
#include"Log/include/QsLogDest.h"
#include <iostream>
using namespace std;
using namespace QsLogging;
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);initLogger(); //初始化日志}Widget::~Widget()
{delete ui;destroyLogger();//销毁日志
}void Widget::initLogger()
{Logger& logger = Logger::instance();logger.setLoggingLevel(QsLogging::TraceLevel);const QString sLogPath(QDir(QCoreApplication::applicationDirPath()).filePath("log.txt"));DestinationPtr fileDestination(DestinationFactory::MakeFileDestination(sLogPath));DestinationPtr sigsSlotDestination(DestinationFactory::MakeFunctorDestination(this, SLOT(logSlot(QString,int))));logger.addDestination(fileDestination);logger.addDestination(sigsSlotDestination);}//析构
void Widget::destroyLogger()
{QsLogging::Logger::destroyInstance();
}//槽函数
void Widget::logSlot(const QString &message, int level)
{ui->textBrowser->append(qPrintable(message));
}void Widget::on_pushButton_clicked()
{int a=8088,b=9;if(a-b>0)QLOG_ERROR()<<"okok";
}void Widget::on_pushButton_2_clicked()
{int a=18,b=9;if(a-b>0)QLOG_WARN()<<"hdsajhj fdhj";
}
然后在文件夹下就会有:
这个QsLog日志不支持追加功能好像,但是可以设置日志大小以及可以备份几个之前的日志个数,就是假如你项目运行完一次就是有一个新日志,其实这样也合理着,每执行一次程序就只有一次日志。
使用QmessageBox的话可以这样
int test(){bool isfinish=false;if(命令执行成功){isfinish=true;}else{isfinish=false;}return isfinish;
}
外部
if(!test()){QMessageBox::informatcion();
}
还有一种不用qt的日志框架,自己写一个日志消息处理的函数
代码如下
main.cpp:
#include "widget.h"
#include <QApplication>
#include <QMutex>
#include <QDateTime>
#include <QFile>
#include <QTextStream>void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{static QMutex mutex;mutex.lock();QString text;switch (type){case QtDebugMsg:text = QString("Debug : ");break;case QtWarningMsg:text = QString("Warning :");break;case QtCriticalMsg:text = QString("Critical : ");break;case QtFatalMsg:text = QString("Fatal ");}QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");QString current_date = QString("(%1)").arg(current_date_time);QString message = QString("%1%2%3%4").arg(text).arg(context_info).arg(msg).arg(current_date);QString path = QCoreApplication::applicationDirPath() + QString("/log.txt");QFile file(path);file.open(QIODevice::WriteOnly | QIODevice::Append);QTextStream text_stream(&file);text_stream << message << "\r\n";file.flush();file.close();mutex.unlock();
}int main(int argc, char *argv[])
{QApplication a(argc, argv);qInstallMessageHandler(outputMessage);Widget w;w.show();return a.exec();
}
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#define LOG(X) DebugMessage(X)#include <QWidget>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui;void DebugMessage(const QString strmessage);
};#endif // WIDGET_H
widget.cpp:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);LOG("hello world");
}Widget::~Widget()
{delete ui;
}void Widget::DebugMessage(const QString strmessage)
{qDebug()<<strmessage;
}
这样只要用到这个LOG宏就直接在log.txt里写入了日志,现象如下: