107 lines
3.5 KiB
C++
107 lines
3.5 KiB
C++
#include "logger.h"
|
||
|
||
#include <QtCore/QDebug>
|
||
#include <QtCore/QDateTime>
|
||
|
||
#include <iostream>
|
||
|
||
//==============================================================================
|
||
//
|
||
// Функция для перехвата вызовов логирования Qt:
|
||
//
|
||
//==============================================================================
|
||
void qtLogMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
|
||
{
|
||
// Ошибки и предупреждения дублируются на стандартный вывод ошибок:
|
||
if ((type == QtWarningMsg) || (type == QtCriticalMsg) || (type == QtFatalMsg)) {
|
||
|
||
std::cerr << msg.toLocal8Bit().constData() << std::endl;
|
||
}
|
||
|
||
// Запись строки в лог файл:
|
||
Logger::instance().writeLog(type, context, msg);
|
||
}
|
||
|
||
//==============================================================================
|
||
//
|
||
// Logger
|
||
//
|
||
//==============================================================================
|
||
Logger &Logger::instance()
|
||
{
|
||
// Создаётнся один экземпляр логгера на всю программу:
|
||
static Logger loggerInstance;
|
||
return loggerInstance;
|
||
}
|
||
//==============================================================================
|
||
QString Logger::logTypeToString(QtMsgType msgType)
|
||
{
|
||
switch (msgType) {
|
||
case QtDebugMsg:
|
||
return "Debug";
|
||
case QtInfoMsg:
|
||
return "Info";
|
||
case QtWarningMsg:
|
||
return "Warning";
|
||
case QtCriticalMsg:
|
||
return "Error";
|
||
case QtFatalMsg:
|
||
return "Fatal";
|
||
default:
|
||
return "Text";
|
||
}
|
||
}
|
||
//==============================================================================
|
||
void Logger::start()
|
||
{
|
||
// Регистрация нашей функции в качестве обработчика для логов:
|
||
qInstallMessageHandler( qtLogMessageOutput );
|
||
|
||
// Тут надо открыть файл logFile для записи логов и держать открытым до вызова stop()
|
||
// После открытия тут же записать в лог начальные строки
|
||
|
||
// ...
|
||
|
||
}
|
||
//==============================================================================
|
||
void Logger::stop()
|
||
{
|
||
// Отмена регистрации нашей функции:
|
||
qInstallMessageHandler(0);
|
||
|
||
// Тут надо записать последние строки в лог файл и закрыть его
|
||
|
||
// ...
|
||
}
|
||
//==============================================================================
|
||
void Logger::writeLog(QtMsgType type, const QMessageLogContext &context, const QString &msg)
|
||
{
|
||
Q_UNUSED(context)
|
||
|
||
QString logText = QString("[%1] %2: %3")
|
||
.arg(
|
||
QDateTime::currentDateTime().toString("HH:mm:ss.zzz"),
|
||
logTypeToString(type),
|
||
msg
|
||
);
|
||
|
||
// Тут надо записать строку в лог файл:
|
||
// [13:10:05.960] Debug: Пример строки
|
||
|
||
Q_UNUSED(logText)
|
||
// ...
|
||
}
|
||
//==============================================================================
|
||
Logger::Logger(QObject *parent) : QObject{parent}
|
||
{
|
||
// Конструктор приватный - недоступен извне
|
||
}
|
||
//==============================================================================
|
||
Logger::~Logger()
|
||
{
|
||
// Обязательно остановить:
|
||
stop();
|
||
}
|
||
//==============================================================================
|
||
|