feat: add logger with write to file

This commit is contained in:
semenov
2025-08-06 16:04:53 +03:00
parent 305fcb2fad
commit 34dddad3cd
20 changed files with 213 additions and 154 deletions

View File

@@ -5,14 +5,11 @@ CommonClientHandler::CommonClientHandler(QObject *parent) : QObject(parent)
}
void CommonClientHandler::initialize(QMap<int, ClientHandler *> *clientsMap, ProcessingSystem *processingSystem, DataParser *dataParser, Logger *logger)
void CommonClientHandler::initialize(QMap<int, ClientHandler *> *clientsMap, ProcessingSystem *processingSystem, DataParser *dataParser)
{
this->clientsMap = clientsMap;
this->processingSystem = processingSystem;
this->dataParser = dataParser;
this->logger = logger;
connect(this,&CommonClientHandler::sigSendToLogger,logger,&Logger::addTextToLogger,Qt::AutoConnection);
}
void CommonClientHandler::sendNewVersionListToAllClient()

View File

@@ -15,8 +15,7 @@ public:
explicit CommonClientHandler(QObject *parent = nullptr);
void initialize(QMap<int, ClientHandler*> *clientsMap,
ProcessingSystem *processingSystem,
DataParser *dataParser,
Logger *logger);
DataParser *dataParser);
void sendNewVersionListToAllClient();
void sendCurrentVersionToAllClient();
@@ -32,8 +31,6 @@ private:
QMap<int, ClientHandler*> *clientsMap;
ProcessingSystem *processingSystem;
DataParser *dataParser;
Logger *logger;
};
#endif // COMMONCLIENTHANDLER_H

View File

@@ -2,10 +2,16 @@
#include <QThread>
Logger::Logger()
{
//this->listWidget = widget;
connect(this,&Logger::sigAddToLogger, this, &Logger::handleLog,Qt::QueuedConnection);
createDirectory();
}
Logger &Logger::instance()
{
static Logger logger;
return logger;
}
Logger::~Logger()
@@ -13,22 +19,79 @@ Logger::~Logger()
}
void Logger::setTypeLog(QString type)
void Logger::setLoggingType(LoggingType type)
{
typeLogger = type;
this->loggingType = type;
}
void Logger::addTextToLogger(QString msg)
void Logger::log(QString message, LogLevel level)
{
if(typeLogger == "widget")
emit sigAddToLogger(message,level);
}
void Logger::setLogFile(QString filePath)
{
QMutexLocker locker(&mutex);
if (logFile.isOpen())
{
emit sigSendTextToLogger(msg);
logFile.close();
}
else if (typeLogger == "console")
logFile.setFileName(filePath);
logFile.open(QIODevice::WriteOnly | QIODevice::Append);
}
void Logger::setLogToFile(bool flag)
{
isLogToFile = flag;
if (flag)
{
//qDebug() << msg;
}else
{
emit sigSendTextToLogger(msg);
QString filePath = logFolderPath + "/" + "log " + QDateTime::currentDateTime().toString("dd-MM-yyyy")+".txt";
setLogFile(filePath);
}
}
void Logger::handleLog(QString msg, LogLevel logLevel)
{
QString level;
switch (logLevel)
{
case INFO: level = "INFO"; break;
case WARNING: level = "WARNING"; break;
case ERROR: level = "ERROR"; break;
case CRITICAL: level = "CRITICAL"; break;
}
QString timeStamp = QDateTime::currentDateTime().toString("hh:mm:ss");
QString message = timeStamp + " " + level + " " + msg;
if (loggingType == LoggingType::WIDGET)
{
emit sigLogToWidget(message);
}
else if(loggingType == LoggingType::CONSOLE)
{
qDebug() << message;
}
if(isLogToFile)
{
QMutexLocker locker(&mutex);
if (logFile.isOpen())
{
QTextStream stream(&logFile);
stream << message << "\n";
}
}
}
void Logger::createDirectory()
{
QString directoryPath = logFolderPath;
QDir dir(directoryPath);
if(!dir.exists()) dir.mkdir(".");
}

View File

@@ -1,25 +1,58 @@
#ifndef LOGGER_H
#define LOGGER_H
#include <QPlainTextEdit>
#include <QDateTime>
#include <QMutex>
#include <QObject>
#include <QDebug>
#include <QDir>
#include "Systems/tools.h"
enum LogLevel
{
INFO,
WARNING,
ERROR,
CRITICAL
};
enum LoggingType
{
WIDGET,
CONSOLE,
TOFILE
};
class Logger : public QObject
{
Q_OBJECT
public:
explicit Logger();
Logger();
static Logger& instance();
~Logger();
void setTypeLog(QString type);
void setWidget(QPlainTextEdit * widget);
void setLoggingType(LoggingType type);
void log(QString message,LogLevel level = INFO);
void setLogFile(QString filePath);
void setLogToFile(bool flag);
public slots:
void addTextToLogger(QString msg);
void handleLog(QString msg,LogLevel logLevel = INFO);
signals:
void sigSendTextToLogger(QString msg);
void sigAddToLogger(QString msg, LogLevel logLevel = INFO);
void sigLogToWidget(QString message);
private:
//ServerLMSWidget *listWidget;
QString typeLogger;
QString msg;
QFile logFile;
LoggingType loggingType;
QMutex mutex;
bool isLogToFile;
void createDirectory();
};
#endif // LOGGER_H

View File

@@ -13,7 +13,6 @@ ProcessingSystem::ProcessingSystem(ProviderDBLMS* providerDBLMS, UpdateControlle
void ProcessingSystem::initialize(MultiThreadServer *server, DataParser *dataParser,
CommonClientHandler *commonClientHandler,
Logger *logger,
UpdateController *updateController,
ChatSystem *chatSystem)
{
@@ -27,9 +26,8 @@ void ProcessingSystem::initialize(MultiThreadServer *server, DataParser *dataPar
connect(this,&ProcessingSystem::sigStatusTasksAMMofTraineeChanged,commonClientHandler, &CommonClientHandler::slot_StatusTasksAMMofTraineeChanged,Qt::AutoConnection);
connect(this,&ProcessingSystem::sigStatusTasksFIMofTraineeChanged,commonClientHandler, &CommonClientHandler::slot_StatusTasksFIMofTraineeChanged,Qt::AutoConnection);
connect(this,&ProcessingSystem::sigUpdateListClients,server,&MultiThreadServer::updateClientList,Qt::AutoConnection);
connect(this,&ProcessingSystem::sigSetData,updateController,&UpdateController::setDataInfo,Qt::AutoConnection);
connect(this,&ProcessingSystem::sigLogMessage,logger,&Logger::addTextToLogger,Qt::QueuedConnection);
}
void ProcessingSystem::processingClientAutorization(ClientHandler *client, ClientAutorization clientAutorization)
@@ -40,7 +38,7 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien
client->sendXmlAnswer(arrayAnswer);
QString str = QString(arrayAnswer);
emit sigLogMessage("To Client: " + str);
Logger::instance().log("To Client: " + str);
return;
}
@@ -108,7 +106,7 @@ void ProcessingSystem::processingClientDeAutorization(ClientHandler *client, Cli
client->sendXmlAnswer(arrayAnswer);
QString str = QString(arrayAnswer);
emit sigLogMessage("To Client: " + str);
Logger::instance().log("To Client: " + str);
return;
}
@@ -498,6 +496,7 @@ void ProcessingSystem::processingClientQueryTasksXML(ClientHandler *client, Clie
{
nameFile = tasksFIMfileName;
pathFile = updateController->getPathAdditionalFile(nameFile);
Logger::instance().log(pathFile);
client->sendFileBlock(pathFile);
client->sendPacketType(PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_FIM);
}

View File

@@ -29,7 +29,6 @@ public:
void initialize(MultiThreadServer *server,
DataParser* dataParser,
CommonClientHandler *commonClientServer,
Logger *logger,
UpdateController *updateComtroller,
ChatSystem *chatSystem);
@@ -62,7 +61,6 @@ signals:
void sigListsInstructorsTraineesChanged();
void sigStatusTasksAMMofTraineeChanged(int trainee_id);
void sigStatusTasksFIMofTraineeChanged(int trainee_id);
void sigLogMessage(QString log);
void sigAddToMessanger(QString login,QString text);
void sigSetData(DataInfo *dataInfo);

View File

@@ -139,7 +139,7 @@ void RecognizeSystem::recognize()
stream.commitTransaction();
//if(!) continue;
//ПОЛУЧЕНИЕ САМОГО ФАЙЛА
qDebug() << (Tools::getTime() + "AfterRead size and path BytesAvailable: " + socket->bytesAvailable());
Logger::instance().log("AfterRead size and path BytesAvailable: " + QString::number(socket->bytesAvailable()));
qint64 readSize = 65535;
forever
@@ -148,7 +148,7 @@ void RecognizeSystem::recognize()
if(fileSize < readSize)
{
readSize = fileSize;
qDebug() << "LastPackage: " << readSize;
Logger::instance().log("LastPackage: " + QString::number(readSize));
}
socket->waitForReadyRead(20);
@@ -165,7 +165,7 @@ void RecognizeSystem::recognize()
if(fileSize == 0) break;
}
qDebug() << (Tools::getTime() + "File loaded");
Logger::instance().log("File loaded");
//ОЧИСТКА ПОСЛЕ ПЕРЕДАЧИ
fileSize = 0;
@@ -225,7 +225,7 @@ void RecognizeSystem::recognize()
if (file.exists())
{
file.remove(); //удаление файла, если он уже есть, но необходимо обновить
qDebug() << Tools::getTime() + "Delete exist file: " + filePath;
Logger::instance().log("Delete exist file: " + filePath);
}
if (!file.open(QFile::Append))
@@ -333,11 +333,10 @@ void RecognizeSystem::recognize()
}
QString logMessage = Tools::getTime() + " ";
logMessage.append("Load from " + client->getLogin() + " ");
QString logMessage = "Load from " + client->getLogin() + " ";
logMessage.append(fileInfo.fileName());
emit sigSendToLogger(logMessage);
Logger::instance().log(logMessage);
file.close();

View File

@@ -1,22 +1,20 @@
#include "sendsystem.h"
SendSystem::SendSystem(QObject *parent) : QObject(parent)
{
isSendStopped = false;
}
void SendSystem::initialize(DataParser *dataParser,Logger *logger)
void SendSystem::initialize(DataParser *dataParser,QMutex *globalMutex)
{
this->dataParser = dataParser;
this->logger = logger;
connect(this,&SendSystem::sigSendToLogger,logger,&Logger::addTextToLogger,Qt::AutoConnection);
connect(this,&SendSystem::sigSendXMLmessage,dataParser->ClientAnswer(),&ClientAnswerParser::message,Qt::AutoConnection);
connect(this,&SendSystem::sigSendNotify,dataParser->ClientAnswer(),&ClientAnswerParser::notify,Qt::DirectConnection); //потому что возвращает значение
connect(this,&SendSystem::sigSendVersion,dataParser->ClientAnswer(),&ClientAnswerParser::currentVersion,Qt::AutoConnection);
qDebug() << "SendSystem thread: " << QThread::currentThreadId();
mutex = globalMutex;
}
void SendSystem::setClient(Client *client,QTcpSocket *socket)
@@ -35,30 +33,35 @@ void SendSystem::sendMessageBlock(QString message)
void SendSystem::sendFileBlock(QString path)
{
qDebug() << "sendFileBlock thread: " << QThread::currentThreadId();
//qDebug() << "sendFileBlock thread: " << QThread::currentThreadId();
Logger::instance().log("TRY LOCK MUTEX : " + client->getLogin(),LogLevel::WARNING);
QMutexLocker locker(mutex);
Logger::instance().log("LOCK MUTEX " + client->getLogin(),LogLevel::WARNING);
QFile file(path);
QFileInfo fileInfo(file);
Logger::instance().log("OPEN FILE : " + client->getLogin() + " " + fileInfo.fileName());
if(isSendStopped)
{ //Поведение на случай отключения клиента
file.close();
Logger::instance().log("UNLOCK STOP MUTEX : " + client->getLogin(),LogLevel::ERROR);
return;
}
QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
fileSize = file.size();
Logger::instance().log("size FILE :" + client->getLogin() + " " + QString::number(fileSize));
fileSize = fileInfo.size();
if(fileSize == 0){
emit sigSendToLogger(Tools::getTime() + " WARNING! Zero size " + path);
if (fileSize == 0)
{
Logger::instance().log("Client: " + client->getLogin() + " WARNING! Zero size " + fileInfo.fileName(),LogLevel::ERROR);
Logger::instance().log(path,LogLevel::ERROR);
Logger::instance().log("UNLOCK SIZE MUTEX : " + client->getLogin(),LogLevel::ERROR);
return;
}
stream << PacketType::TYPE_FILE; //Отправляем тип блока
stream << path << fileSize;
@@ -77,14 +80,17 @@ void SendSystem::sendFileBlock(QString path)
//emit sigSendToLogger(Tools::getTime() + " send file " + fileInfo.fileName());
}
Logger::instance().log("Sended to : " + client->getLogin() + " : " + fileInfo.fileName());
file.close();
Logger::instance().log("CLOSE FILE : " + client->getLogin() + " " + fileInfo.fileName());
countSend = 0;
Logger::instance().log("UNLOCK MUTEX : " + client->getLogin(),LogLevel::WARNING);
}
void SendSystem::sendFileBlockByteArray(QByteArray array, PacketType packetType)
{
qDebug() << "sendFileBlockByteArray thread: " << QThread::currentThreadId();
QMutexLocker locker(mutex);
if(client->GETTYPE() == TypeClientAutorization::TYPE_QT_CLIENT ||
client->GETTYPE() == TypeClientAutorization::TYPE_GUI)
{
@@ -94,7 +100,7 @@ void SendSystem::sendFileBlockByteArray(QByteArray array, PacketType packetType)
fileSize = array.size();
if(fileSize == 0){
emit sigSendToLogger(Tools::getTime() + " WARNING! Zero size ");
Logger::instance().log(" WARNING! Zero size ",LogLevel::ERROR);
return;
}
@@ -123,6 +129,7 @@ void SendSystem::sendVersion()
void SendSystem::sendFileBlockWithRename(QString path, QString newName)
{
QMutexLocker locker(mutex);
qDebug() << "sendFileBlockWithRename thread: " << QThread::currentThreadId();
QDataStream stream(socket);
@@ -133,7 +140,7 @@ void SendSystem::sendFileBlockWithRename(QString path, QString newName)
fileSize = fileInfo.size();
if(fileSize == 0){
emit sigSendToLogger(Tools::getTime() + " WARNING! Zero size " + path);
Logger::instance().log("Client: " + client->getLogin() + " WARNING! Zero size " + fileInfo.fileName(),LogLevel::ERROR);
return;
}
@@ -160,7 +167,7 @@ void SendSystem::sendFileBlockWithRename(QString path, QString newName)
countSend++;
}
emit sigSendToLogger(Tools::getTime() + " send file " + fileInfo.fileName());
Logger::instance().log("Send file " + fileInfo.fileName());
}
file.close();
@@ -194,6 +201,7 @@ void SendSystem::sendDeleteBlock(QString path)
void SendSystem::sendPacketType(PacketType packetType)
{
QMutexLocker locker(mutex);
if (client->GETTYPE() == TypeClientAutorization::TYPE_QT_CLIENT ||
client->GETTYPE() == TypeClientAutorization::TYPE_GUI)
{
@@ -219,6 +227,7 @@ void SendSystem::sendHello()
void SendSystem::sendNotify(QString notify)
{
QMutexLocker locker(mutex);
qDebug() << "SendNotify thread: " << QThread::currentThreadId();
auto answer = emit sigSendNotify(notify);//"END");
sendXmlAnswer(answer);
@@ -226,6 +235,7 @@ void SendSystem::sendNotify(QString notify)
void SendSystem::sendXmlAnswer(QByteArray array, PacketType packetType)
{
QMutexLocker locker(mutex);
qDebug() << "SendSystemThread: " << QThread::currentThreadId();
if (client->GETTYPE() == TypeClientAutorization::TYPE_QT_CLIENT ||
client->GETTYPE() == TypeClientAutorization::TYPE_GUI)

View File

@@ -4,6 +4,7 @@
#include <QObject>
#include <QString>
#include <QtNetwork>
#include <QMutex>
#include <Systems/Parsers/dataparser.h>
#include <Systems/tools.h>
@@ -12,7 +13,6 @@
class DataParser;
class FileData;
class SendSystem : public QObject
{
@@ -20,7 +20,7 @@ class SendSystem : public QObject
public:
explicit SendSystem(QObject* parent = nullptr);
void initialize(DataParser* dataParser,Logger *logger);
void initialize(DataParser* dataParser,QMutex *globalMutex);
void setClient(Client* client,QTcpSocket *socket);
void sendMessageBlock(QString message);
void sendFileBlock(QString path);
@@ -49,7 +49,6 @@ public slots:
signals:
void sigLoadHash();
void sigSendToLogger(QString message);
QByteArray sigSendXMLmessage(QString loginFrom, QString loginTo, QString text, QString userType);
QByteArray sigSendNotify(QString message);
QByteArray sigSendVersion();
@@ -58,9 +57,8 @@ private:
Client *client;
QTcpSocket* socket;
DataParser* dataParser;
Logger *logger;
QMutex *mutex;
quint64 fileSize;
QMutex *mutex;
int countSend;
bool isSendStopped;
TypeClientAutorization type;

View File

@@ -7,12 +7,6 @@ void Tools::printTime()
qDebug() << QTime::currentTime().toString("hh:mm:ss.zzz");
}
QString Tools::getTime()
{
return QTime::currentTime().toString("hh:mm:ss.zzz");
}
QString Tools::createLocalPath(QString path)
{
qint8 pos = path.indexOf(applicationFolderName);

View File

@@ -28,6 +28,7 @@ static const QString buildDataPath = "/Application/" + projectFolderName + "/RRJ
static const QString tasksAMMfileName = "/docs.xml"; //"/tasksAmm.xml";
static const QString tasksFIMfileName = "/tasksFIM.xml";
static const QString clientHash = staticDataFolderName + "/clientHash.xml";
static const QString logFolderPath = "log";
static const QString baseNameVersion = "base";//может вынести комманды куда нибудь?

View File

@@ -7,11 +7,11 @@ UpdateController::UpdateController(QObject *parent) :
{
buildPath = QDir::currentPath() + "/" + applicationFolderName;
sharedDataPath = QDir::currentPath() + "/" + sharedDataFolderName;
emit sigLogMessage(buildPath);
Logger::instance().log(buildPath);
qDebug() << hashFileName;
}
void UpdateController::initialize(CommonClientHandler *commonClientHandler,DataParser *dataParser,AssetsManager *assetManager,Logger *logger)
void UpdateController::initialize(CommonClientHandler *commonClientHandler,DataParser *dataParser,AssetsManager *assetManager)
{
this->commonClientHandler = commonClientHandler;
this->dataParser = dataParser;
@@ -31,8 +31,6 @@ void UpdateController::initialize(CommonClientHandler *commonClientHandler,DataP
return;
}
connect(this,&UpdateController::sigLogMessage,logger,&Logger::addTextToLogger,Qt::AutoConnection);
calculateFullHash();
currentStreamingPath = assetManager->setVersion("base"); //TODO: сохрнаять предыдущую версию и загружать ее при включении
setUpCurrentServerHash();
@@ -82,20 +80,19 @@ void UpdateController::compareFiles(ClientHandler* handler, QByteArray array)
void UpdateController::showHash()
{
for(FileData& str : serverDataList){
emit sigLogMessage(str.hash);
Logger::instance().log(str.hash);
}
}
void UpdateController::calculateFullHash()
{
qDebug() << "Calculate hash...";
Logger::instance().log("Calculate hash...");
commonClientHandler->slot_sendPacketToAllClients(PacketType::BUSY);
auto *list = calculateHash(buildPath);
saveHash(buildHashName,list);
calculateSharedHash();
emit sigLogMessage("Calculate hash complete");
Logger::instance().log("Calculate hash complete");
commonClientHandler->slot_sendPacketToAllClients(PacketType::FREE);
qDebug() << "Calculate complete...";
}
void UpdateController::calculateFullHashWithSetup()
@@ -175,7 +172,7 @@ QList<FileData>* UpdateController::loadHash(QString filename)
xmlReader.readNextStartElement();
}
emit sigLogMessage("Hash load from file ");
Logger::instance().log("Hash load from file ");
return files;
@@ -194,8 +191,8 @@ void UpdateController::calculateSize()
iterator.next();
}
emit sigLogMessage("Full size: ");
emit sigLogMessage(QString::number(total));
Logger::instance().log("Full size: ");
Logger::instance().log(QString::number(total));
}
QString UpdateController::getCommands()
@@ -272,14 +269,13 @@ bool UpdateController::checkNeedUpdate(ClientHandler *handler)
if(forSend->length() > 0) //формирование сообщения об обновлении
{
QString log;
log.append(Tools::getTime());
log.append(" Client: " + handler->getClient()->getLogin());
log.append(" Need updates: ");
log.append(QString::number(forSend->length()));
log.append(" objects");
fileSendList = *forSend;
emit sigLogMessage(log);
Logger::instance().log(log);
//printFileList(*forSend);
handler->sendMessageBlock(log);
@@ -288,16 +284,14 @@ bool UpdateController::checkNeedUpdate(ClientHandler *handler)
else
{
QString log;
log.append(Tools::getTime());
log.append(" Client: " + handler->getClient()->getLogin());
log.append(" no update required");
emit sigLogMessage(log);
Logger::instance().log(log);
handler->sendMessageBlock(log);
}
if(forDelete->length() > 0){
QString log;
log.append(Tools::getTime());
log.append(" Client: " + handler->getClient()->getLogin());
log.append(" Need delete: ");
@@ -305,7 +299,7 @@ bool UpdateController::checkNeedUpdate(ClientHandler *handler)
log.append(" objects");
fileDeleteList = *forDelete;
emit sigLogMessage(log);
Logger::instance().log(log);
//printFileList(*forDelete);
handler->sendMessageBlock(log);
needUpdate = true;
@@ -313,11 +307,10 @@ bool UpdateController::checkNeedUpdate(ClientHandler *handler)
else
{
QString log;
log.append(Tools::getTime());
log.append(" Client: " + handler->getClient()->getLogin());
log.append(" no delete required");
emit sigLogMessage(log);
Logger::instance().log(log);
handler->sendMessageBlock(log);
}
@@ -542,7 +535,7 @@ void UpdateController::printFileList(QList<FileData> fileData)
while (iterator.hasNext())
{
auto next = iterator.next();
emit sigLogMessage(next.path);
Logger::instance().log(next.path);
}
}

View File

@@ -32,7 +32,7 @@ class UpdateController : public QObject
public:
explicit UpdateController(QObject *parent = 0);
void initialize(CommonClientHandler* commonClientHandler,DataParser *dataParser,AssetsManager *assetManager,Logger *logger);
void initialize(CommonClientHandler* commonClientHandler,DataParser *dataParser,AssetsManager *assetManager);
void compareFiles(ClientHandler* handler, QByteArray array);
void showHash();
void calculateFullHash();
@@ -68,7 +68,6 @@ public slots:
void setUpCurrentServerHash();
signals:
void sigLogMessage(QString message);
void sigErrorRequired(int code);
private: