Fix key when inserting new logger in LoggerMap,

Prepare logBuffer-JSON snapshot view in LoggerManager,
Increase buffered loglines to 500
This commit is contained in:
LordGrey
2023-12-28 17:00:24 +01:00
parent 1166c76582
commit 1cc87831cb
3 changed files with 44 additions and 34 deletions

View File

@@ -6,6 +6,7 @@
#include <QMap> #include <QMap>
#include <QAtomicInteger> #include <QAtomicInteger>
#include <QList> #include <QList>
#include <QJsonArray>
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
#include <QRecursiveMutex> #include <QRecursiveMutex>
@@ -14,8 +15,6 @@
#endif #endif
// stl includes // stl includes
#include <stdio.h>
#include <stdarg.h>
#ifdef _WIN32 #ifdef _WIN32
#include <stdexcept> #include <stdexcept>
#endif #endif
@@ -59,7 +58,7 @@ public:
QString function; QString function;
unsigned int line; unsigned int line;
QString fileName; QString fileName;
uint64_t utime; qint64 utime;
QString message; QString message;
LogLevel level; LogLevel level;
QString levelString; QString levelString;
@@ -74,7 +73,7 @@ public:
void setMinLevel(LogLevel level) { _minLevel = static_cast<int>(level); } void setMinLevel(LogLevel level) { _minLevel = static_cast<int>(level); }
LogLevel getMinLevel() const { return static_cast<LogLevel>(int(_minLevel)); } LogLevel getMinLevel() const { return static_cast<LogLevel>(int(_minLevel)); }
QString getName() const { return _name; } QString getName() const { return _name; }
QString getSubName() const { return _subname; } QString getSubName() const { return _subName; }
signals: signals:
void newLogMessage(Logger::T_LOG_MESSAGE); void newLogMessage(Logger::T_LOG_MESSAGE);
@@ -95,7 +94,7 @@ private:
static QAtomicInteger<int> GLOBAL_MIN_LOG_LEVEL; static QAtomicInteger<int> GLOBAL_MIN_LOG_LEVEL;
const QString _name; const QString _name;
const QString _subname; const QString _subName;
const bool _syslogEnabled; const bool _syslogEnabled;
const unsigned _loggerId; const unsigned _loggerId;
@@ -109,15 +108,15 @@ class LoggerManager : public QObject
public: public:
static LoggerManager* getInstance(); static LoggerManager* getInstance();
const QList<Logger::T_LOG_MESSAGE>* getLogMessageBuffer() const { return &_logMessageBuffer; }
public slots: public slots:
void handleNewLogMessage(const Logger::T_LOG_MESSAGE&); void handleNewLogMessage(const Logger::T_LOG_MESSAGE&);
QJsonArray getLogMessageBuffer(Logger::LogLevel filter=Logger::UNSET) const;
signals: signals:
void newLogMessage(const Logger::T_LOG_MESSAGE&); void newLogMessage(const Logger::T_LOG_MESSAGE&);
protected: private:
LoggerManager(); LoggerManager();
QList<Logger::T_LOG_MESSAGE> _logMessageBuffer; QList<Logger::T_LOG_MESSAGE> _logMessageBuffer;

View File

@@ -1984,24 +1984,10 @@ void JsonAPI::incommingLogMessage(const Logger::T_LOG_MESSAGE &msg)
if (!_streaming_logging_activated) if (!_streaming_logging_activated)
{ {
_streaming_logging_activated = true; _streaming_logging_activated = true;
const QList<Logger::T_LOG_MESSAGE> *logBuffer = LoggerManager::getInstance()->getLogMessageBuffer(); QMetaObject::invokeMethod(LoggerManager::getInstance(), "getLogMessageBuffer",
for (int i = 0; i < logBuffer->length(); i++) Qt::DirectConnection,
{ Q_RETURN_ARG(QJsonArray, messageArray),
//Only present records of the current log-level Q_ARG(Logger::LogLevel, _log->getLogLevel()));
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);
}
}
} }
else else
{ {

View File

@@ -2,7 +2,6 @@
#include <utils/FileUtils.h> #include <utils/FileUtils.h>
#include <iostream> #include <iostream>
#include <algorithm>
#ifndef _WIN32 #ifndef _WIN32
#include <syslog.h> #include <syslog.h>
@@ -15,7 +14,8 @@
#include <QFileInfo> #include <QFileInfo>
#include <QMutexLocker> #include <QMutexLocker>
#include <QThreadStorage> #include <QThreadStorage>
#include <time.h> #include <QJsonObject>
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QRecursiveMutex Logger::MapLock; QRecursiveMutex Logger::MapLock;
@@ -38,6 +38,7 @@ const size_t MAX_IDENTIFICATION_LENGTH = 22;
QAtomicInteger<unsigned int> LoggerCount = 0; QAtomicInteger<unsigned int> LoggerCount = 0;
QAtomicInteger<unsigned int> LoggerId = 0; QAtomicInteger<unsigned int> LoggerId = 0;
const int MAX_LOG_MSG_BUFFERED = 500;
const int MaxRepeatCountSize = 200; const int MaxRepeatCountSize = 200;
QThreadStorage<int> RepeatCount; QThreadStorage<int> RepeatCount;
QThreadStorage<Logger::T_LOG_MESSAGE> RepeatMessage; QThreadStorage<Logger::T_LOG_MESSAGE> RepeatMessage;
@@ -51,8 +52,7 @@ Logger* Logger::getInstance(const QString & name, const QString & subName, Logge
if (log == nullptr) if (log == nullptr)
{ {
log = new Logger(name, subName, minLevel); log = new Logger(name, subName, minLevel);
LoggerMap.insert(name, log); // compat version, replace it with following line if we have 100% c++11 LoggerMap.insert(name + subName, log);
//LoggerMap.emplace(name, log); // not compat with older linux distro's e.g. wheezy
connect(log, &Logger::newLogMessage, LoggerManager::getInstance(), &LoggerManager::handleNewLogMessage); 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) Logger::Logger (const QString & name, const QString & subName, LogLevel minLevel)
: QObject() : QObject()
, _name(name) , _name(name)
, _subname(subName) , _subName(subName)
, _syslogEnabled(true) , _syslogEnabled(true)
, _loggerId(LoggerId++) , _loggerId(LoggerId++)
, _minLevel(static_cast<int>(minLevel)) , _minLevel(static_cast<int>(minLevel))
@@ -161,7 +161,7 @@ void Logger::write(const Logger::T_LOG_MESSAGE & message)
.toStdString() .toStdString()
<< std::endl; << std::endl;
newLogMessage(message); emit newLogMessage(message);
} }
void Logger::Message(LogLevel level, const char* sourceFile, const char* func, unsigned int line, const char* fmt, ...) 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 && if (RepeatMessage.localData().loggerName == _name &&
RepeatMessage.localData().loggerSubName == _subname && RepeatMessage.localData().loggerSubName == _subName &&
RepeatMessage.localData().function == func && RepeatMessage.localData().function == func &&
RepeatMessage.localData().message == msg && RepeatMessage.localData().message == msg &&
RepeatMessage.localData().line == line) 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; Logger::T_LOG_MESSAGE logMsg;
logMsg.loggerName = _name; logMsg.loggerName = _name;
logMsg.loggerSubName = _subname; logMsg.loggerSubName = _subName;
logMsg.function = QString(func); logMsg.function = QString(func);
logMsg.line = line; logMsg.line = line;
logMsg.fileName = FileUtils::getBaseName(sourceFile); logMsg.fileName = FileUtils::getBaseName(sourceFile);
@@ -233,11 +233,36 @@ void Logger::Message(LogLevel level, const char* sourceFile, const char* func, u
LoggerManager::LoggerManager() LoggerManager::LoggerManager()
: QObject() : QObject()
, _loggerMaxMsgBufferSize(200) , _loggerMaxMsgBufferSize(MAX_LOG_MSG_BUFFERED)
{ {
_logMessageBuffer.reserve(_loggerMaxMsgBufferSize); _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) void LoggerManager::handleNewLogMessage(const Logger::T_LOG_MESSAGE & msg)
{ {
_logMessageBuffer.push_back(msg); _logMessageBuffer.push_back(msg);