aboutsummaryrefslogtreecommitdiff
path: root/src/common/logger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/logger.cpp')
-rw-r--r--src/common/logger.cpp61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/common/logger.cpp b/src/common/logger.cpp
new file mode 100644
index 00000000..11446f24
--- /dev/null
+++ b/src/common/logger.cpp
@@ -0,0 +1,61 @@
+#include "cru/common/logger.hpp"
+
+#include "cru/common/format.hpp"
+
+#include <cstdlib>
+#include <ctime>
+#include <memory>
+#include <string_view>
+
+namespace cru::log {
+namespace {
+Logger *CreateLogger() {
+ const auto logger = new Logger();
+ logger->AddSource(new StdioLoggerSource());
+ return logger;
+}
+} // namespace
+
+Logger *Logger::GetInstance() {
+ static std::unique_ptr<Logger> logger{CreateLogger()};
+ return logger.get();
+}
+
+Logger::~Logger() {
+ for (const auto i : sources_) {
+ delete i;
+ }
+}
+
+void Logger::AddSource(ILoggerSource *source) { sources_.push_back(source); }
+
+void Logger::RemoveSource(ILoggerSource *source) { sources_.remove(source); }
+
+namespace {
+std::wstring_view LogLevelToString(LogLevel level) {
+ switch (level) {
+ case LogLevel::Debug:
+ return L"DEBUG";
+ case LogLevel::Info:
+ return L"INFO";
+ case LogLevel::Warn:
+ return L"WARN";
+ case LogLevel::Error:
+ return L"ERROR";
+ default:
+ std::abort();
+ }
+}
+} // namespace
+
+void Logger::Log(LogLevel level, const std::wstring_view &s) {
+ for (const auto source : sources_) {
+ auto now = std::time(nullptr);
+ wchar_t buffer[50];
+ std::wcsftime(buffer, 50, L"%c", std::localtime(&now));
+
+ source->Write(level, util::Format(L"[{}] {}: {}\n", buffer,
+ LogLevelToString(level), s));
+ }
+}
+} // namespace cru::log