gpt4all
65 строк · 1.8 Кб
1#include "logger.h"
2
3#include <QFile>
4#include <QDebug>
5#include <QStandardPaths>
6#include <QDateTime>
7#include <iostream>
8
9class MyLogger: public Logger { };
10Q_GLOBAL_STATIC(MyLogger, loggerInstance)
11Logger *Logger::globalInstance()
12{
13return loggerInstance();
14}
15
16Logger::Logger()
17{
18// Get log file dir
19auto dir = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
20// Remove old log file
21QFile::remove(dir+"/log-prev.txt");
22QFile::rename(dir+"/log.txt", dir+"/log-prev.txt");
23// Open new log file
24m_file.setFileName(dir+"/log.txt");
25if (!m_file.open(QIODevice::NewOnly | QIODevice::WriteOnly | QIODevice::Text)) {
26qWarning() << "Failed to open log file, logging to stdout...";
27m_file.open(stdout, QIODevice::WriteOnly | QIODevice::Text);
28}
29// On success, install message handler
30qInstallMessageHandler(Logger::messageHandler);
31}
32
33void Logger::messageHandler(QtMsgType type, const QMessageLogContext &, const QString &msg)
34{
35auto logger = globalInstance();
36// Get message type as string
37QString typeString;
38switch (type) {
39case QtDebugMsg:
40typeString = "Debug";
41break;
42case QtInfoMsg:
43typeString = "Info";
44break;
45case QtWarningMsg:
46typeString = "Warning";
47break;
48case QtCriticalMsg:
49typeString = "Critical";
50break;
51case QtFatalMsg:
52typeString = "Fatal";
53break;
54default:
55typeString = "???";
56}
57// Get time and date
58auto timestamp = QDateTime::currentDateTime().toString();
59// Write message
60const std::string out = QString("[%1] (%2): %4\n").arg(typeString, timestamp, msg).toStdString();
61logger->m_file.write(out.c_str());
62logger->m_file.flush();
63std::cerr << out;
64fflush(stderr);
65}
66