diff --git a/include/utils/Logger.h b/include/utils/Logger.h index 74c36954..0f71700e 100644 --- a/include/utils/Logger.h +++ b/include/utils/Logger.h @@ -6,6 +6,7 @@ #include #include #include +#include #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) #include @@ -14,8 +15,6 @@ #endif // stl includes -#include -#include #ifdef _WIN32 #include #endif @@ -59,7 +58,7 @@ public: QString function; unsigned int line; QString fileName; - uint64_t utime; + qint64 utime; QString message; LogLevel level; QString levelString; @@ -74,7 +73,7 @@ public: void setMinLevel(LogLevel level) { _minLevel = static_cast(level); } LogLevel getMinLevel() const { return static_cast(int(_minLevel)); } QString getName() const { return _name; } - QString getSubName() const { return _subname; } + QString getSubName() const { return _subName; } signals: void newLogMessage(Logger::T_LOG_MESSAGE); @@ -95,7 +94,7 @@ private: static QAtomicInteger GLOBAL_MIN_LOG_LEVEL; const QString _name; - const QString _subname; + const QString _subName; const bool _syslogEnabled; const unsigned _loggerId; @@ -109,15 +108,15 @@ class LoggerManager : public QObject public: static LoggerManager* getInstance(); - const QList* getLogMessageBuffer() const { return &_logMessageBuffer; } public slots: void handleNewLogMessage(const Logger::T_LOG_MESSAGE&); + QJsonArray getLogMessageBuffer(Logger::LogLevel filter=Logger::UNSET) const; signals: void newLogMessage(const Logger::T_LOG_MESSAGE&); -protected: +private: LoggerManager(); QList _logMessageBuffer; diff --git a/libsrc/api/JsonAPI.cpp b/libsrc/api/JsonAPI.cpp index 6b16c4f9..a60bb26a 100644 --- a/libsrc/api/JsonAPI.cpp +++ b/libsrc/api/JsonAPI.cpp @@ -1984,24 +1984,10 @@ void JsonAPI::incommingLogMessage(const Logger::T_LOG_MESSAGE &msg) if (!_streaming_logging_activated) { _streaming_logging_activated = true; - const QList *logBuffer = LoggerManager::getInstance()->getLogMessageBuffer(); - for (int i = 0; i < logBuffer->length(); i++) - { - //Only present records of the current log-level - if ( logBuffer->at(i).level >= _log->getLogLevel()) - { - message["loggerName"] = logBuffer->at(i).loggerName; - message["loggerSubName"] = logBuffer->at(i).loggerSubName; - message["function"] = logBuffer->at(i).function; - message["line"] = QString::number(logBuffer->at(i).line); - message["fileName"] = logBuffer->at(i).fileName; - message["message"] = logBuffer->at(i).message; - message["levelString"] = logBuffer->at(i).levelString; - message["utime"] = QString::number(logBuffer->at(i).utime); - - messageArray.append(message); - } - } + QMetaObject::invokeMethod(LoggerManager::getInstance(), "getLogMessageBuffer", + Qt::DirectConnection, + Q_RETURN_ARG(QJsonArray, messageArray), + Q_ARG(Logger::LogLevel, _log->getLogLevel())); } else { diff --git a/libsrc/utils/Logger.cpp b/libsrc/utils/Logger.cpp index b34981c9..9822501f 100644 --- a/libsrc/utils/Logger.cpp +++ b/libsrc/utils/Logger.cpp @@ -2,7 +2,6 @@ #include #include -#include #ifndef _WIN32 #include @@ -15,7 +14,8 @@ #include #include #include -#include +#include + #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) QRecursiveMutex Logger::MapLock; @@ -38,6 +38,7 @@ const size_t MAX_IDENTIFICATION_LENGTH = 22; QAtomicInteger LoggerCount = 0; QAtomicInteger LoggerId = 0; +const int MAX_LOG_MSG_BUFFERED = 500; const int MaxRepeatCountSize = 200; QThreadStorage RepeatCount; QThreadStorage RepeatMessage; @@ -51,8 +52,7 @@ Logger* Logger::getInstance(const QString & name, const QString & subName, Logge if (log == nullptr) { log = new Logger(name, subName, minLevel); - LoggerMap.insert(name, log); // compat version, replace it with following line if we have 100% c++11 - //LoggerMap.emplace(name, log); // not compat with older linux distro's e.g. wheezy + LoggerMap.insert(name + subName, log); connect(log, &Logger::newLogMessage, LoggerManager::getInstance(), &LoggerManager::handleNewLogMessage); } @@ -105,7 +105,7 @@ Logger::LogLevel Logger::getLogLevel(const QString & name, const QString & subNa Logger::Logger (const QString & name, const QString & subName, LogLevel minLevel) : QObject() , _name(name) - , _subname(subName) + , _subName(subName) , _syslogEnabled(true) , _loggerId(LoggerId++) , _minLevel(static_cast(minLevel)) @@ -161,7 +161,7 @@ void Logger::write(const Logger::T_LOG_MESSAGE & message) .toStdString() << std::endl; - newLogMessage(message); + emit newLogMessage(message); } void Logger::Message(LogLevel level, const char* sourceFile, const char* func, unsigned int line, const char* fmt, ...) @@ -195,7 +195,7 @@ void Logger::Message(LogLevel level, const char* sourceFile, const char* func, u }; if (RepeatMessage.localData().loggerName == _name && - RepeatMessage.localData().loggerSubName == _subname && + RepeatMessage.localData().loggerSubName == _subName && RepeatMessage.localData().function == func && RepeatMessage.localData().message == msg && RepeatMessage.localData().line == line) @@ -213,7 +213,7 @@ void Logger::Message(LogLevel level, const char* sourceFile, const char* func, u Logger::T_LOG_MESSAGE logMsg; logMsg.loggerName = _name; - logMsg.loggerSubName = _subname; + logMsg.loggerSubName = _subName; logMsg.function = QString(func); logMsg.line = line; logMsg.fileName = FileUtils::getBaseName(sourceFile); @@ -233,11 +233,36 @@ void Logger::Message(LogLevel level, const char* sourceFile, const char* func, u LoggerManager::LoggerManager() : QObject() - , _loggerMaxMsgBufferSize(200) + , _loggerMaxMsgBufferSize(MAX_LOG_MSG_BUFFERED) { _logMessageBuffer.reserve(_loggerMaxMsgBufferSize); } +QJsonArray LoggerManager::getLogMessageBuffer(Logger::LogLevel filter) const +{ + QJsonArray messageArray; + { + for (const auto &logLine : std::as_const(_logMessageBuffer)) + { + if (logLine.level >= filter) + { + QJsonObject message; + message["loggerName"] = logLine.loggerName; + message["loggerSubName"] = logLine.loggerSubName; + message["function"] = logLine.function; + message["line"] = QString::number(logLine.line); + message["fileName"] = logLine.fileName; + message["message"] = logLine.message; + message["levelString"] = logLine.levelString; + message["utime"] = QString::number(logLine.utime); + + messageArray.append(message); + } + } + } + return messageArray; +} + void LoggerManager::handleNewLogMessage(const Logger::T_LOG_MESSAGE & msg) { _logMessageBuffer.push_back(msg);