Qt_IM_23 - 8BitsCoding/RobotMentor GitHub Wiki


// logger.h
#pragma once

#include <QObject>
#include <qdebug.h>
#include <qfile.h>
#include <qdir.h>
#include <qdatetime.h>
#include <iostream>
#include <qtextstream.h>

class logger : public QObject
{
	Q_OBJECT

public:
	explicit logger(QObject *parent = nullptr);
	~logger();

	static bool logging;
	static QString filename;
	static void attach();
	static void handler(QtMsgType type, const QMessageLogContext& context, const QString& msg);

signals:

public slots:

};
// logger.cpp
#include "logger.h"

QString logger::filename = QDir::currentPath() + QDir::separator() + "log.txt";
bool logger::logging = false;
static const QtMessageHandler QT_DEFAULT_MESSAGE_HANDLER = qInstallMessageHandler(nullptr);

logger::logger(QObject *parent)
	: QObject(parent)
{
}

logger::~logger()
{
}

void logger::attach()
{
	logger::logging = true;
	qInstallMessageHandler(logger::handler);
}

void logger::handler(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{
	if (logger::logging) {
		QString txt;
		switch (type) {
		case QtInfoMsg:
			txt = QString("Info: %1 in %2").arg(msg);
			break;
		case QtDebugMsg:
			txt = QString("Debug: %1 in %2").arg(msg);
			break;
		case QtWarningMsg:
			txt = QString("Warning: %1 in %2").arg(msg);
			break;
		case QtCriticalMsg:
			txt = QString("Critical: %1 in %2").arg(msg);
			break;
		case QtFatalMsg:
			txt = QString("Fatal: %1 in %2").arg(msg);
			break;
		}

		QFile file(logger::filename);
		if (file.open(QIODevice::WriteOnly | QIODevice::Append)) {
			QTextStream ts(&file);
			ts << QDateTime::currentDateTime().toString() << " - " << txt << " file: " << context.file << " line: " << context.line << endl;
			ts.flush();
			file.close();
		}
	}

	(*QT_DEFAULT_MESSAGE_HANDLER)(type, context, msg);
}
// main.cpp
#include <QtCore/QCoreApplication>

#include <qdebug.h>
#include "logger.h"

int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);

	qInfo() << "File: " << logger::filename;
	logger::attach();
	qInfo() << "test!";

	logger::logging = false;
	qInfo() << "Don't log this!";

	logger::logging = true;
	qInfo() << "Finished";

	return a.exec();
}

이미지

⚠️ **GitHub.com Fallback** ⚠️