// 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();
}
