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_OBJECT
public:
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_OBJECT
public:
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里写入了日志,现象如下: