diff --git a/gpt4all-chat/CMakeLists.txt b/gpt4all-chat/CMakeLists.txt index 2071cfd8..0fca75c5 100644 --- a/gpt4all-chat/CMakeLists.txt +++ b/gpt4all-chat/CMakeLists.txt @@ -71,6 +71,7 @@ qt_add_executable(chat localdocs.h localdocs.cpp localdocsmodel.h localdocsmodel.cpp llm.h llm.cpp server.h server.cpp + logger.h logger.cpp sysinfo.h ) diff --git a/gpt4all-chat/logger.cpp b/gpt4all-chat/logger.cpp new file mode 100644 index 00000000..b9c4a8bf --- /dev/null +++ b/gpt4all-chat/logger.cpp @@ -0,0 +1,61 @@ +#include "logger.h" + +#include +#include +#include +#include + +class MyLogger: public Logger { }; +Q_GLOBAL_STATIC(MyLogger, loggerInstance) +Logger *Logger::globalInstance() +{ + return loggerInstance(); +} + +Logger::Logger() +{ + // Get log file dir + auto dir = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation); + // Remove old log file + QFile::remove(dir+"/log-prev.txt"); + QFile::rename(dir+"/log.txt", dir+"/log-prev.txt"); + // Open new log file + m_file.setFileName(dir+"/log.txt"); + if (!m_file.open(QIODevice::NewOnly | QIODevice::WriteOnly | QIODevice::Text)) { + qWarning() << "Failed to open log file, logging to stdout..."; + m_file.open(stdout, QIODevice::WriteOnly | QIODevice::Text); + } + // On success, install message handler + qInstallMessageHandler(Logger::messageHandler); +} + +void Logger::messageHandler(QtMsgType type, const QMessageLogContext &, const QString &msg) +{ + auto logger = globalInstance(); + // Get message type as string + QString typeString; + switch (type) { + case QtDebugMsg: + typeString = "Debug"; + break; + case QtInfoMsg: + typeString = "Info"; + break; + case QtWarningMsg: + typeString = "Warning"; + break; + case QtCriticalMsg: + typeString = "Critical"; + break; + case QtFatalMsg: + typeString = "Fatal"; + break; + default: + typeString = "???"; + } + // Get time and date + auto timestamp = QDateTime::currentDateTime().toString(); + // Write message + logger->m_file.write(QString("[%1] (%2): %4\n").arg(typeString, timestamp, msg).toStdString().c_str()); + logger->m_file.flush(); +} diff --git a/gpt4all-chat/logger.h b/gpt4all-chat/logger.h new file mode 100644 index 00000000..d02143e4 --- /dev/null +++ b/gpt4all-chat/logger.h @@ -0,0 +1,18 @@ +#ifndef LOGGER_H +#define LOGGER_H +#include + +class Logger +{ + QFile m_file; + + static void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg); + +public: + static Logger *globalInstance(); + + explicit Logger(); + friend class MyLogger; +}; + +#endif // LOGGER_H diff --git a/gpt4all-chat/main.cpp b/gpt4all-chat/main.cpp index 621c3597..5ca2b292 100644 --- a/gpt4all-chat/main.cpp +++ b/gpt4all-chat/main.cpp @@ -10,6 +10,7 @@ #include "download.h" #include "network.h" #include "config.h" +#include "logger.h" int main(int argc, char *argv[]) { @@ -19,6 +20,8 @@ int main(int argc, char *argv[]) QCoreApplication::setApplicationVersion(APP_VERSION); QSettings::setDefaultFormat(QSettings::IniFormat); + Logger::globalInstance(); + QGuiApplication app(argc, argv); QQmlApplicationEngine engine; qmlRegisterSingletonInstance("llm", 1, 0, "LLM", LLM::globalInstance());