Skip to content
Extraits de code Groupes Projets
Vérifiée Valider 59bacba8 rédigé par Kubat's avatar Kubat
Parcourir les fichiers

LOG: Add things to log in the VivyApplication class to test the thing

parent 3f1e12d7
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!21Add clean logs support + dependent MR
...@@ -8,6 +8,7 @@ set(STL_INC ...@@ -8,6 +8,7 @@ set(STL_INC
<stdexcept> <stdexcept>
<sstream> <sstream>
<map> <map>
<utility>
<locale> <locale>
<functional> <functional>
<initializer_list> <initializer_list>
......
...@@ -5,6 +5,39 @@ using namespace Vivy; ...@@ -5,6 +5,39 @@ using namespace Vivy;
LogSink::~LogSink() noexcept {} LogSink::~LogSink() noexcept {}
LogMessage::~LogMessage() noexcept { parentLogger->sendLogMessage(*this); } LogMessage::~LogMessage() noexcept { parentLogger->sendLogMessage(*this); }
const chrono::milliseconds
LogMessage::getTimeStamp() const noexcept
{
return timeStamp;
}
LogMessage::Header const &
LogMessage::getHeader() const noexcept
{
return messageHeader;
}
const std::string_view
LogMessage::getTextBuffer() const noexcept
{
const char *txt = textBuffer.data();
return std::string_view{ txt, strlen(txt) };
}
void
Logger::sendLogMessage(const LogMessage &msg) const noexcept
{
parentLogSink->recieveLogMessage(this, msg);
}
// Get the log message from the logger and add it to the sink's queue.
void
LogSink::recieveLogMessage(const Logger *const logger, LogMessage const &msg) noexcept
{
const std::lock_guard<std::mutex> messageQueueLockGuard(messageQueueLock);
messageQueue.emplace_back(msg);
}
std::shared_ptr<LogSink> std::shared_ptr<LogSink>
LogSink::newSink() noexcept LogSink::newSink() noexcept
{ {
...@@ -45,11 +78,6 @@ Logger::logEvent(const char *fileName, const char *functionName, const int lineN ...@@ -45,11 +78,6 @@ Logger::logEvent(const char *fileName, const char *functionName, const int lineN
.lineNumberInFile = lineNumber }); .lineNumberInFile = lineNumber });
} }
void
Logger::sendLogMessage(const LogMessage &msg) const noexcept {
TODO(Write the code to send the event...)
}
LogMessage::LogMessage(Logger *const logger, const LogMessage::Header hdr) noexcept LogMessage::LogMessage(Logger *const logger, const LogMessage::Header hdr) noexcept
: messageHeader(hdr) : messageHeader(hdr)
, parentLogger(logger) , parentLogger(logger)
...@@ -57,19 +85,37 @@ LogMessage::LogMessage(Logger *const logger, const LogMessage::Header hdr) noexc ...@@ -57,19 +85,37 @@ LogMessage::LogMessage(Logger *const logger, const LogMessage::Header hdr) noexc
} }
LogMessage & LogMessage &
LogMessage::operator<<(const std::string &) noexcept LogMessage::operator<<(const std::string &msg) noexcept
{ {
return *this; return (*this << msg.c_str());
} }
LogMessage & LogMessage &
LogMessage::operator<<(const int) noexcept LogMessage::operator<<(const QString &msg) noexcept
{ {
return *this; return (*this << msg.toStdString());
}
LogMessage &
LogMessage::operator<<(const int i) noexcept
{
return (*this << static_cast<long>(i));
}
LogMessage &
LogMessage::operator<<(const long i) noexcept
{
return (*this << std::to_string(i));
} }
LogMessage & LogMessage &
LogMessage::operator<<(const long) noexcept LogMessage::operator<<(const char *str) noexcept
{ {
const std::size_t length = strlen(str);
for (std::size_t i = 0; (i < length) && (indexInArray < messageBufferLength - 1);
++i, ++indexInArray) {
textBuffer[indexInArray] = str[i];
}
textBuffer[indexInArray] = '\0';
return *this; return *this;
} }
...@@ -25,6 +25,7 @@ namespace Vivy ...@@ -25,6 +25,7 @@ namespace Vivy
{ {
class VivyApplication; class VivyApplication;
class VivyCli; class VivyCli;
class LogSinkDispatcher;
class LogSink; class LogSink;
class Logger; class Logger;
class LogMessage; class LogMessage;
...@@ -41,7 +42,8 @@ enum class LogLevel : int { ...@@ -41,7 +42,8 @@ enum class LogLevel : int {
}; };
// LogSink is the parent logger. It will recieve messages and display them to a // LogSink is the parent logger. It will recieve messages and display them to a
// console or to std::cerr or to a file, etc. // console or to std::cerr or to a file, etc. The save to over file, etc will
// be donne by the LogSinkDispatcher.
class LogSink { class LogSink {
VIVY_UNMOVABLE_OBJECT(LogSink) VIVY_UNMOVABLE_OBJECT(LogSink)
...@@ -55,15 +57,17 @@ public: ...@@ -55,15 +57,17 @@ public:
void closeLoggerClient(Logger *const) noexcept; void closeLoggerClient(Logger *const) noexcept;
void closeLoggerClient(const std::shared_ptr<Logger> &) noexcept; void closeLoggerClient(const std::shared_ptr<Logger> &) noexcept;
void recieveLogMessage(const Logger *const, LogMessage const &) noexcept;
private: private:
std::mutex messageQueueLock{};
std::vector<LogMessage> messageQueue; std::vector<LogMessage> messageQueue;
std::vector<std::shared_ptr<Logger>> clientLoggers; std::vector<std::shared_ptr<Logger>> clientLoggers;
}; };
// Message to be logged, constructed by a logger then send // Message to be logged, constructed by a logger then send
class LogMessage final { class LogMessage final {
friend class Logger; public:
struct Header final { struct Header final {
const char *fileName; const char *fileName;
const char *functionName; const char *functionName;
...@@ -72,7 +76,19 @@ class LogMessage final { ...@@ -72,7 +76,19 @@ class LogMessage final {
}; };
LogMessage(Logger *const, const Header) noexcept; LogMessage(Logger *const, const Header) noexcept;
~LogMessage() noexcept; // The message will be send on destruction
Header const &getHeader() const noexcept;
const std::string_view getTextBuffer() const noexcept;
const chrono::milliseconds getTimeStamp() const noexcept;
LogMessage &operator<<(const std::string &) noexcept;
LogMessage &operator<<(const QString &) noexcept;
LogMessage &operator<<(const char *) noexcept;
LogMessage &operator<<(const int) noexcept;
LogMessage &operator<<(const long) noexcept;
private:
const Header messageHeader; const Header messageHeader;
const chrono::milliseconds timeStamp{ duration_cast<chrono::milliseconds>( const chrono::milliseconds timeStamp{ duration_cast<chrono::milliseconds>(
chrono::system_clock::now().time_since_epoch()) }; chrono::system_clock::now().time_since_epoch()) };
...@@ -81,14 +97,6 @@ class LogMessage final { ...@@ -81,14 +97,6 @@ class LogMessage final {
std::array<char, messageBufferLength> textBuffer{}; std::array<char, messageBufferLength> textBuffer{};
std::size_t indexInArray{ 0 }; std::size_t indexInArray{ 0 };
Logger *const parentLogger; Logger *const parentLogger;
public:
// The message will be send on destruction
~LogMessage() noexcept;
LogMessage &operator<<(const std::string &) noexcept;
LogMessage &operator<<(const int) noexcept;
LogMessage &operator<<(const long) noexcept;
}; };
// A logger class, a client to LogSink. Will generate and send instances of // A logger class, a client to LogSink. Will generate and send instances of
......
...@@ -11,19 +11,22 @@ VivyApplication::VivyApplication(int &argc, char **argv) ...@@ -11,19 +11,22 @@ VivyApplication::VivyApplication(int &argc, char **argv)
void void
VivyApplication::setTheme(Theme theme) noexcept VivyApplication::setTheme(Theme theme) noexcept
{ {
if (theme == Theme::System) if (theme == Theme::System) {
logInfo() << "Set theme to system theme";
return; return;
}
const QString sheet = theme == Theme::Dark ? QStringLiteral(":qdarkstyle/dark/style.qss") const QString sheet = theme == Theme::Dark ? QStringLiteral(":qdarkstyle/dark/style.qss")
: QStringLiteral(":qdarkstyle/light/style.qss"); : QStringLiteral(":qdarkstyle/light/style.qss");
QFile stylesheet(sheet); QFile stylesheet(sheet);
if (!stylesheet.exists()) { if (!stylesheet.exists()) {
qFatal("Missing stylesheet"); logFatal() << "Missing stylesheet!";
} else { } else {
stylesheet.open(QFile::ReadOnly | QFile::Text); stylesheet.open(QFile::ReadOnly | QFile::Text);
QTextStream stylesheetStream(&stylesheet); QTextStream stylesheetStream(&stylesheet);
setStyleSheet(stylesheetStream.readAll()); setStyleSheet(stylesheetStream.readAll());
logInfo() << "Theme set using " << sheet;
} }
} }
...@@ -56,6 +59,8 @@ VivyApplication::exec() noexcept ...@@ -56,6 +59,8 @@ VivyApplication::exec() noexcept
mainWindowPtr = std::make_unique<MainWindow>(); mainWindowPtr = std::make_unique<MainWindow>();
mainWindowPtr->show(); mainWindowPtr->show();
logInfo() << "Entering the main event loop";
// Main loop // Main loop
return QApplication::exec(); return QApplication::exec();
} }
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter