server-sdk/src/serversdk/logger.cpp
2019-11-08 11:01:30 +01:00

104 lines
2.6 KiB
C++

#include "logger.h"
#include "loggermessage.h"
#include <QLoggingCategory>
#include <QFileInfo>
Q_LOGGING_CATEGORY(sdkcore, "sdk.core");
Q_LOGGING_CATEGORY(sdknetwork, "sdk.network");
Q_LOGGING_CATEGORY(sdkcompress, "sdk.compress");
namespace serversdk {
Logger* Logger::sConsumer = nullptr;
//bool Logger::sShowFunction = false;
void Logger::setConsumer(Logger *consumer)
{
sConsumer = consumer;
}
Logger::Logger(QObject *parent) : QObject(parent)
{
qRegisterMetaType<LoggerMessage>();
}
QList<LoggerMessage> Logger::getNewMessages(int currentCount)
{
QMutexLocker locker(&mMutex);
QList<LoggerMessage> list;
int count = mLogMessages.count();
int total = count - currentCount;
if (total <= 0)
return list;
for (int i = 0; i < total; ++i) {
int currentIndex = currentCount;
int row = i + currentIndex;
list.append(mLogMessages.at(row));
}
return list;
}
void Logger::outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QString shortFile = QFileInfo(context.file).fileName();
QString text;
QString textType;
switch (type) {
case QtDebugMsg:
textType = QStringLiteral("debug");
break;
case QtWarningMsg:
textType = QStringLiteral("warning");
break;
case QtCriticalMsg:
textType = QStringLiteral("critical");
break;
case QtFatalMsg:
textType = QStringLiteral("fatal");
break;
#if QT_VERSION >= 0x050500
case QtInfoMsg:
textType = QStringLiteral("info");
break;
#endif
}
if (sConsumer) {
LoggerMessage logmsg(shortFile,context.line,context.function,textType,context.category,msg, QLatin1String(""));
sConsumer->pushMessage(logmsg); // emiting message
}
// Output message
//text += QString("%1 %2:%3 %4").arg(context.category).arg(shortFile).arg(context.line).arg(msg);
// New output syntax
text = QStringLiteral("[%1] %2 [ %3:%4 | %5 | %6 ]")
.arg(textType, msg, shortFile)
.arg(context.line)
.arg(context.function, context.category);
QTextStream out(stderr);
out << text << "\n"; //.toLocal8Bit() + "\n";
//out.flush(); // INVSDK-37 ORK-102 crash on windows when flush() -> possible threading problem
if (type == QtFatalMsg)
abort();
}
/** Passing data to consumer */
void Logger::pushMessage(const LoggerMessage& logmsg)
{
emit sConsumer->messageReceived(logmsg);
QMutexLocker locker(&sConsumer->mMutex);
sConsumer->mLogMessages.append(logmsg);
emit sConsumer->messageListUpdated();
}
} // core