added logger and settings at very first version

This commit is contained in:
Jesse Qu 2025-04-16 21:08:47 +08:00
parent 36c850fe4d
commit 41bc01902b
8 changed files with 229 additions and 0 deletions

View File

@ -11,6 +11,8 @@ qt_add_executable(EventConfigurator
mainwindow.cpp
mainwindow.h
mainwindow.ui
logger.h logger.cpp
settings.h settings.cpp
)
target_link_libraries(EventConfigurator

2
apps/conf/config.ini Normal file
View File

@ -0,0 +1,2 @@

59
apps/logger.cpp Normal file
View File

@ -0,0 +1,59 @@
#include "logger.h"
#include "settings.h"
#include <QFileInfo>
#include <sys/stat.h>
QString Logging::fileName = "../logs/EventConfigurator.log";
qint64 Logging::maxFileSize = 1024 *1024 * 10;
int Logging::maxBackupFiles = 5;
QString Logging::messagePattern = "[%{time yyyyMMdd h:mm:ss.zzz ttt} %{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}] %{file}:%{line} - %{message}";
QtMessageHandler Logging::originalHandler = nullptr;
void Logging::setupLogging()
{
fileName = Settings::instance().value("Log", "logFile").toString();
messagePattern = Settings::instance().value("Log", "pattern").toString();
maxFileSize = Settings::instance().value("Log", "maxSize").toLongLong();
maxBackupFiles = Settings::instance().value("Log", "backups").toInt();
qSetMessagePattern(messagePattern);
originalHandler = qInstallMessageHandler(Logging::logMessageHandler);
}
void Logging::logMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QString message = qFormatLogMessage(type, context, msg);
static FILE *f = fopen(Logging::fileName.toLocal8Bit().constData(), "a");
if (f) {
fprintf(f, "%s\n", qPrintable(message));
fflush(f);
}
else {
f = fopen(Logging::fileName.toLocal8Bit().constData(), "a");
if (f) {
fprintf(f, "%s\n", qPrintable(message));
fflush(f);
}
}
struct stat st;
stat(Logging::fileName.toLocal8Bit().constData(), &st);
auto fileSize = st.st_size;
if(fileSize > Logging::maxFileSize) {
if (f) {
fclose(f);
f = nullptr;
}
rollLogFiles();
}
if (originalHandler)
(*originalHandler)(type, context, msg);
}
void Logging::rollLogFiles()
{
QFile::remove(QString("%1.%2").arg(Logging::fileName).arg(Logging::maxBackupFiles));
for(int i = Logging::maxBackupFiles - 1; i > 0; i--)
QFile::rename(QString("%1.%2").arg(Logging::fileName).arg(i), QString("%1.%2").arg(Logging::fileName).arg(i + 1));
QFile::rename(Logging::fileName, QString("%1.1").arg(Logging::fileName));
}

35
apps/logger.h Normal file
View File

@ -0,0 +1,35 @@
#ifndef LOGGER_H
#define LOGGER_H
#include <QLoggingCategory>
#include <QtCore/qobject.h>
#include <QtLogging>
#include <QtDebug>
Q_DECLARE_LOGGING_CATEGORY(Application)
Q_DECLARE_LOGGING_CATEGORY(Window)
class Logging: public QObject
{
Q_OBJECT
public:
static void setupLogging();
static void logMessageHandler(QtMsgType, const QMessageLogContext &, const QString &);
private:
static void rollLogFiles();
private:
static qint64 maxFileSize;
static int maxBackupFiles;
private:
static QString fileName;
static QString messagePattern;
static QtMessageHandler originalHandler;
};
#endif // LOGGER_H

View File

@ -1,10 +1,20 @@
#include "logger.h"
#include "settings.h"
#include "mainwindow.h"
#include <QApplication>
Q_LOGGING_CATEGORY(Application, "Application")
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Logging::setupLogging();
// qCInfo(Application) << "Application starts 程序启动";
qCInfo(Application, "Application starts 程序启动");
Settings::instance();
MainWindow w;
w.show();
return a.exec();

View File

@ -1,10 +1,14 @@
#include "logger.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
Q_LOGGING_CATEGORY(Window, "Window")
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
qCDebug(Window) << "Window starts 窗口构建";
ui->setupUi(this);
}

84
apps/settings.cpp Normal file
View File

@ -0,0 +1,84 @@
#include "settings.h"
#include <QCoreApplication>
#include <QDir>
#include <QFile>
Settings& Settings::instance()
{
static Settings instance;
return instance;
}
Settings::Settings()
{
m_settingsFile = QDir::cleanPath(QCoreApplication::applicationDirPath() + "/../conf/config.ini");
QFile file(m_settingsFile);
if (file.open(QIODevice::ReadWrite)) {
m_isVaildSettingsFile = true;
m_settings = new QSettings(m_settingsFile, QSettings::IniFormat);
}
else {
m_isVaildSettingsFile = false;
}
}
Settings::~Settings()
{
if (m_isVaildSettingsFile) {
delete m_settings;
}
}
QVariant Settings::getDefaultValue(const QString& group, const QString& name)
{
if(group == "Log" && name == "logFile")
return QDir::cleanPath(QCoreApplication::applicationDirPath() + "/../logs/EventConfigurator.log");
else if(group == "Log" && name == "pattern")
return "[%{time yyyyMMdd h:mm:ss.zzz ttt} %{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}] %{file}:%{line} - %{message}";
else if(group == "Log" && name == "level")
return "DEBUG";
else if(group == "Log" && name == "maxSize")
return 10485760;
else if(group == "Log" && name == "backups")
return 5;
else if(group == "Log" && name == "consoleOutput")
return "false";
else if(group == "Log" && name == "fileOutput")
return "true";
else
return QVariant();
}
void Settings::setValue(const QString& group, const QString& name, const QVariant& value)
{
if(!m_isVaildSettingsFile)
return;
m_settings->beginGroup(group);
m_settings->setValue(name, value);
m_settings->endGroup();
}
QVariant Settings::value(const QString& group, const QString& name)
{
QVariant defaultVaule = getDefaultValue(group, name);
if(!m_isVaildSettingsFile)
return defaultVaule;
QVariant value = m_settings->value(group + "/" + name, defaultVaule);
return value;
}
void Settings::clearValue(const QString& group, const QString& name)
{
m_settings->beginGroup(group);
m_settings->remove(name);
m_settings->endGroup();
}
bool Settings::contains(const QString& group, const QString& name)
{
return m_settings->contains(group + "/" + name);
}

33
apps/settings.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef SETTINGS_H
#define SETTINGS_H
#include <QObject>
#include <QSettings>
class Settings
{
public:
static Settings& instance();
public:
void setValue(const QString& group, const QString& name, const QVariant& value);
QVariant value(const QString& group, const QString& name);
void clearValue(const QString& group, const QString& name);
bool contains(const QString& group, const QString& name);
private:
QVariant getDefaultValue(const QString& group, const QString& name);
private:
explicit Settings();
~Settings();
Settings(const Settings&) = delete;
Settings& operator=(const Settings&) = delete;
private:
QSettings* m_settings;
QString m_settingsFile;
bool m_isVaildSettingsFile;
};
#endif // SETTINGS_H