#include "corelogdeamon.h" #include #include #include namespace CoreLogDeamon { void QLog_Trace(const QString &module, const QString &message) { QLog_(module, TraceLevel, message); } void QLog_Debug(const QString &module, const QString &message) { QLog_(module, DebugLevel, message); } void QLog_Info(const QString &module, const QString &message) { QLog_(module, InfoLevel, message); } void QLog_Warning(const QString &module, const QString &message) { QLog_(module, WarnLevel, message); } void QLog_Error(const QString &module, const QString &message) { QLog_(module, ErrorLevel, message); } void QLog_Fatal(const QString &module, const QString &message) { QLog_(module, FatalLevel, message); } void QLog_(const QString &module, LogLevel level, const QString &message) { QLoggerManager *manager = QLoggerManager::getInstance(); QMutexLocker(&manager->mutex); QLogger *logWriter = manager->getLogInstance(module); if (logWriter && logWriter->getLevel() <= level) logWriter->write(module,level,message); } //QLoggerManager QLoggerManager * QLoggerManager::INSTANCE = NULL; QLoggerManager::QLoggerManager() : QThread(), mutex(QMutex::Recursive) { start(); } QLoggerManager * QLoggerManager::getInstance() { if (!INSTANCE) INSTANCE = new QLoggerManager(); return INSTANCE; } QString QLoggerManager::levelToText(const LogLevel &level) { switch (level) { case TraceLevel: return "Trace log"; case DebugLevel: return "Debug log"; case InfoLevel: return "Info log"; case WarnLevel: return "Warning log"; case ErrorLevel: return "Error log"; case FatalLevel: return "Fatal log"; default: return QString(); } } bool QLoggerManager::addLogInstance(const QString &fileDest, const QString &module, LogLevel level) { QLogger *log; if (!moduleDest.contains(module)) { log = new QLogger(fileDest,level); moduleDest.insert(module, log); return true; } return false; } bool QLoggerManager::addLogInstance(const QString &fileDest, const QStringList &modules, LogLevel level) { QLogger *log; foreach (QString module, modules) { if (!moduleDest.contains(module)) { log = new QLogger(fileDest,level); moduleDest.insert(module, log); return true; } } return false; } bool QLoggerManager::addLogInstance(const QString &module,LogLevel level) { QLogger *log; if(!moduleDest.contains(module)) { QDir dir(QDir::currentPath()); if (!dir.exists("logs")) dir.mkdir("logs"); QString fileDestination = QDir::currentPath() + "/logs/"+ module +".log"; log = new QLogger(fileDestination,level); moduleDest.insert(module,log); return true; } return false; } void QLoggerManager::closeLogger() { exit(0); deleteLater(); } QLogger::QLogger(const QString &fileDestination, LogLevel level,QObject *parent) :QObject(parent) { m_fileDestination = fileDestination; m_level = level; } QLogger::QLogger(LogLevel level,QObject *parent) :QObject(parent) { m_level = level; QDir dir(QDir::currentPath()); if (!dir.exists("logs")) dir.mkdir("logs"); m_fileDestination = QDir::currentPath() + "/logs/system.log"; } QLogger::QLogger():QObject() { } bool QLogger::write(const QString &module, const QString &message) { QString _fileName = m_fileDestination; int MAX_SIZE = 1024 * 1024; QFile file(_fileName); QString toRemove = _fileName.section('.',-1); QString fileNameAux = _fileName.left(_fileName.size() - toRemove.size()-1); bool renamed = false; QString newName = fileNameAux + "_%1__%2.log"; //Renomenem l'arxiu si està ple if (file.size() >= MAX_SIZE) { //Creem un fixer nou QDateTime currentTime = QDateTime::currentDateTime(); newName = newName.arg(currentTime.date().toString("yyyy_MM_dd")).arg(currentTime.time().toString("hh_mm_ss")); renamed = file.rename(_fileName, newName); } file.setFileName(_fileName); if (file.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Append)) { QTextStream out(&file); QString dtFormat = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz"); if (renamed) out << QString("%1 - Previuous log %2\n").arg(dtFormat).arg(newName); QString logLevel = QLoggerManager::levelToText(m_level); QString text = QString("[%1] [%2] {%3} %4\n").arg(dtFormat).arg(logLevel).arg(module).arg(message); out << text; file.close(); return true; } else { //Log faile return false; } } bool QLogger::write(const QString &i_module, const LogLevel i_level, const QString &i_message) { QString _fileName = m_fileDestination; int MAX_SIZE = 1024 * 1024; QFile file(_fileName); QString toRemove = _fileName.section('.',-1); QString fileNameAux = _fileName.left(_fileName.size() - toRemove.size()-1); bool renamed = false; QString newName = fileNameAux + "_%1__%2.log"; //Renomenem l'arxiu si està ple if (file.size() >= MAX_SIZE) { //Creem un fixer nou QDateTime currentTime = QDateTime::currentDateTime(); newName = newName.arg(currentTime.date().toString("yyyy_MM_dd")).arg(currentTime.time().toString("hh_mm_ss")); renamed = file.rename(_fileName, newName); } file.setFileName(_fileName); if (file.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Append)) { QTextStream out(&file); QString dtFormat = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz"); if (renamed) out << QString("%1 - Previuous log %2\n").arg(dtFormat).arg(newName); QString logLevel = QLoggerManager::levelToText(i_level); // QString text = QString("[%1] [%2] {%3} %4\n").arg(dtFormat).arg(logLevel).arg(i_module).arg(i_message); //20200326 QString text = QString("[%1] {%2} %3\n").arg(dtFormat).arg(i_module).arg(i_message); out << text; file.close(); return true; } else { //Log faile return false; } } bool QLogger::read(QString &o_message) { o_message=""; QString _fileName = m_fileDestination; QFile file(_fileName); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); while(!in.atEnd()){ o_message += in.readLine() + "\n"; } file.close(); return true; } else//read fail { return false; } } bool QLogger::read(QStringList &o_message) { o_message.clear(); QString _fileName = m_fileDestination; QFile file(_fileName); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); while(!in.atEnd()){ o_message.append(in.readLine() + "\n"); } file.close(); return true; } else//read fail { return false; } } }