diff options
Diffstat (limited to 'yage/core')
l--------- | yage/core/.#logmessage.h | 1 | ||||
-rw-r--r-- | yage/core/logger.cpp | 1 | ||||
-rw-r--r-- | yage/core/logsink.cpp | 57 | ||||
-rw-r--r-- | yage/core/logsink.h | 3 |
4 files changed, 59 insertions, 3 deletions
diff --git a/yage/core/.#logmessage.h b/yage/core/.#logmessage.h deleted file mode 120000 index c4ccefcf..00000000 --- a/yage/core/.#logmessage.h +++ /dev/null @@ -1 +0,0 @@ -yannherklotz@yann-arch.2036:1510699559
\ No newline at end of file diff --git a/yage/core/logger.cpp b/yage/core/logger.cpp index 12a23dfc..a0114a66 100644 --- a/yage/core/logger.cpp +++ b/yage/core/logger.cpp @@ -20,6 +20,7 @@ namespace yage Logger::Logger() : active_(Active::create()) { add(makeConsoleSink()); + add(makeFileSink("yage.log")); } LogMessage Logger::operator()(const std::string &fileName, int lineNum) diff --git a/yage/core/logsink.cpp b/yage/core/logsink.cpp index a8f4d7b4..081eb5b3 100644 --- a/yage/core/logsink.cpp +++ b/yage/core/logsink.cpp @@ -8,6 +8,10 @@ #include "logsink.h" +#include <chrono> +#include <ctime> +#include <fstream> +#include <iomanip> #include <iostream> namespace yage @@ -42,9 +46,58 @@ void LogSink::write(const LogMessage::Meta &meta, const std::string &msg) const LogSink makeConsoleSink() { return [](const LogMessage::Meta &meta, const std::string &msg) { - std::cout << msg << " (" << meta.fileName << ":" << meta.lineNo - << ")\n"; + std::cout << msg << "\n"; }; } +namespace +{ + +class FileSink +{ +public: + FileSink(std::string &&filename) + : fileHandle_(std::make_shared<std::ofstream>(filename)) + { + if (!fileHandle_->good()) { + throw std::runtime_error("Could not open file: " + filename); + } + } + + FileSink(const std::string filename) + : fileHandle_(std::make_shared<std::ofstream>(filename)) + { + if (!fileHandle_->good()) { + throw std::runtime_error("Could not open file: " + filename); + } + } + + ~FileSink() = default; + + void operator()(const LogMessage::Meta &meta, const std::string &msg) const + { + using namespace std::chrono; + + auto now = system_clock::now(); + auto time_t = system_clock::to_time_t(now); + auto local_time = std::localtime(&time_t); + + (*fileHandle_) << std::put_time(local_time, "[%H:%M:%S] ") << msg + << " (" << meta.fileName << ":" << meta.lineNo << ")\n"; + } + +private: + std::shared_ptr<std::ofstream> fileHandle_; +}; + +} // namespace + +LogSink makeFileSink(const std::string &filename) { + return FileSink(filename); +} + +LogSink makeFileSink(std::string &&filename) { + return FileSink(filename); +} + } // namespace yage diff --git a/yage/core/logsink.h b/yage/core/logsink.h index 526c862e..f51d9f2a 100644 --- a/yage/core/logsink.h +++ b/yage/core/logsink.h @@ -56,6 +56,9 @@ private: LogSink makeConsoleSink(); +LogSink makeFileSink(const std::string &filename); +LogSink makeFileSink(std::string &&filename); + /* ----------------------------------------------------------------------------- * Template Implementation * ----------------------------------------------------------------------------- |