qt 自定义类的日志

        网上的都是 控制台程序的 日志输出。这个是实用时 带界面那种的 日志输出。以后会专门整一个日志类,会更加方便。

.h



#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QFile>
#include <QMutex>
#include <QDateTime>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    static MainWindow* s_this;
    QFile *file;
    QTextStream *text_stream;
    MainWindow(QWidget *parent = nullptr);
    static void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
.cpp


#include "mainwindow.h"
#include "ui_mainwindow.h"



MainWindow* MainWindow::s_this = nullptr;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    s_this=this;
    file=new QFile{"./alarm.txt"};
    file->open(QIODevice::WriteOnly | QIODevice::Append);
    text_stream=new QTextStream{file};
    qInstallMessageHandler(this->outputMessage);
    qDebug("This is a debug message");
    qWarning("This is a warning message");
    qCritical("This is a critical message");
    //qFatal("This is a fatal message");
}

void MainWindow::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);


    //s_this->file->write(message.toLatin1());  //这个也可以使用,file的write 或者 下面stream的输入那个顺手用哪个吧
    s_this->text_stream->operator<<(message);
    s_this->text_stream->operator<<("\r\n");
    s_this->file->flush();           //必须加,不然会有问题

    mutex.unlock();
}

MainWindow::~MainWindow()
{
    file->close();
    delete ui;
}

注意:

1)在编译release版本的时候日志文件中部分内容会为空,比如文件名、函数名和文件行数,因为Qt默认会去掉相关信息,解决方法是在pro文件中添加宏定义 DEFINES += QT_MESSAGELOGCONTEXT,如果是VS开发环境在配置项的C++预编译器中添加此宏,release版本的日志中就会有相关信息

参考了https://blog.csdn.net/CLinuxF/article/details/78948983

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值