From 8b23c5f125140efcdd97912d4b2df20531b0a557 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Thu, 2 Nov 2017 12:46:35 +0000 Subject: Adding logging system --- lib/googletest | 2 +- lib/rapidjson | 2 +- yage/core/logger.cpp | 37 +++++++++++++++++++++++++++ yage/core/logger.h | 27 ++++++++++++++++++-- yage/core/logmessage.cpp | 32 ++++++++++++++++++++++++ yage/core/logmessage.h | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ yage/core/logsink.h | 27 ++++++++++++++++++++ 7 files changed, 188 insertions(+), 4 deletions(-) create mode 100644 yage/core/logger.cpp create mode 100644 yage/core/logmessage.cpp create mode 100644 yage/core/logmessage.h create mode 100644 yage/core/logsink.h diff --git a/lib/googletest b/lib/googletest index bfc0ffc8..d175c8bf 160000 --- a/lib/googletest +++ b/lib/googletest @@ -1 +1 @@ -Subproject commit bfc0ffc8a698072c794ae7299db9cb6866f4c0bc +Subproject commit d175c8bf823e709d570772b038757fadf63bc632 diff --git a/lib/rapidjson b/lib/rapidjson index 4c0f0036..5aa79b72 160000 --- a/lib/rapidjson +++ b/lib/rapidjson @@ -1 +1 @@ -Subproject commit 4c0f0036b54776dfc48ad76eca685caea0a1dc82 +Subproject commit 5aa79b72721b7c8f8efa2fd65ae99912a67c9213 diff --git a/yage/core/logger.cpp b/yage/core/logger.cpp new file mode 100644 index 00000000..f64b908b --- /dev/null +++ b/yage/core/logger.cpp @@ -0,0 +1,37 @@ +/* ---------------------------------------------------------------------------- + * logger.cpp + * + * Copyright (c) 2017 Yann Herklotz Grave -- MIT License + * See file LICENSE for more details + * ---------------------------------------------------------------------------- + */ + +#include "logger.h" + +#include +#include + +using namespace std; + +namespace yage +{ + +LogMessage Logger::operator()() +{ + return LogMessage(this); +} + +void Logger::flush(const LogMessage &msg) +{ + string asString(msg.buffer_.str()); + cout << asString << "\n"; +} + +Logger &Logger::instance() +{ + static Logger gLogger; + + return gLogger; +} + +} // namespace yage diff --git a/yage/core/logger.h b/yage/core/logger.h index 90a958d5..e7187a81 100644 --- a/yage/core/logger.h +++ b/yage/core/logger.h @@ -1,6 +1,29 @@ -#ifndef YAGE_LOGGER_H -#define YAGE_LOGGER_H +/* ---------------------------------------------------------------------------- + * logger.h + * + * Copyright (c) 2017 Yann Herklotz Grave -- MIT License + * See file LICENSE for more details + * ---------------------------------------------------------------------------- + */ +#ifndef YAGE_CORE_LOGGER_H +#define YAGE_CORE_LOGGER_H +#include "logmessage.h" + +namespace yage +{ + +class Logger +{ +public: + LogMessage operator()(); + + void flush(const LogMessage &msg); + + static Logger &instance(); +}; + +} // namespace yage #endif diff --git a/yage/core/logmessage.cpp b/yage/core/logmessage.cpp new file mode 100644 index 00000000..aa512042 --- /dev/null +++ b/yage/core/logmessage.cpp @@ -0,0 +1,32 @@ +/* ---------------------------------------------------------------------------- + * logmessage.cpp + * + * Copyright (c) 2017 Yann Herklotz Grave -- MIT License + * See file LICENSE for more details + * ---------------------------------------------------------------------------- + */ + +#include "logmessage.h" +#include "logger.h" + +namespace yage +{ + +LogMessage::LogMessage(Logger *owner) : owner_(owner) {} + +LogMessage::LogMessage(LogMessage &&msg) : owner_(std::move(msg.owner_)) {} + +LogMessage::~LogMessage() +{ + if (owner_ != nullptr) { + owner_->flush(*this); + } +} + +LogMessage &LogMessage::operator<<(std::ostream &(*fn)(std::ostream &os)) +{ + fn(buffer_); + return *this; +} + +} // namespace yage diff --git a/yage/core/logmessage.h b/yage/core/logmessage.h new file mode 100644 index 00000000..ded40c19 --- /dev/null +++ b/yage/core/logmessage.h @@ -0,0 +1,65 @@ +/* ---------------------------------------------------------------------------- + * logmessage.h + * + * Copyright (c) 2017 Yann Herklotz Grave -- MIT License + * See file LICENSE for more details + * ---------------------------------------------------------------------------- + */ + +#ifndef YAGE_CORE_LOGMESSAGE_H +#define YAGE_CORE_LOGMESSAGE_H + +#include +#include +#include + +namespace yage +{ + +class Logger; + +class LogMessage +{ +public: + ~LogMessage(); + + LogMessage(const LogMessage &msg) = delete; + + LogMessage &operator=(const LogMessage &msg) = delete; + LogMessage &operator=(LogMessage &&msg) = delete; + + template + LogMessage &operator<<(const T &value); + + LogMessage &operator<<(std::ostream &(*fn)(std::ostream &os)); + + struct Meta { + std::string fileName; + int lineNo; + }; + +private: + friend class Logger; + + std::ostringstream buffer_; + Logger *owner_; + + LogMessage(Logger *owner); + LogMessage(LogMessage &&msg); +}; + +/* ----------------------------------------------------------------------------- + * Template definitions + * ----------------------------------------------------------------------------- + */ + +template +LogMessage &LogMessage::operator<<(const T &value) +{ + buffer_ << value; + return *this; +} + +} // namespace yage + +#endif diff --git a/yage/core/logsink.h b/yage/core/logsink.h new file mode 100644 index 00000000..bdfc70cf --- /dev/null +++ b/yage/core/logsink.h @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * logger.cpp + * + * Copyright (c) 2017 Yann Herklotz Grave -- MIT License + * See file LICENSE for more details + * ---------------------------------------------------------------------------- + */ + +#ifndef YAGE_CORE_LOGSINK_H +#define YAGE_CORE_LOGSINK_H + +#include "logmessage.h" + +#include + +namespace yage +{ + +class LogSink +{ +public: + void operator()(const LogMessage::Meta &, const std::string &message); +}; + +} // namespace yage + +#endif -- cgit