aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/CMakeLists.txt13
-rw-r--r--src/common/logger.cpp61
2 files changed, 74 insertions, 0 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
new file mode 100644
index 00000000..afbbc139
--- /dev/null
+++ b/src/common/CMakeLists.txt
@@ -0,0 +1,13 @@
+set(CRU_BASE_INCLUDE_DIR ${CRU_INCLUDE_DIR}/cru/common)
+add_library(cru_base STATIC
+ logger.cpp
+)
+target_sources(cru_base INTERFACE
+ ${CRU_BASE_INCLUDE_DIR}/base.hpp
+ ${CRU_BASE_INCLUDE_DIR}/event.hpp
+ ${CRU_BASE_INCLUDE_DIR}/format.hpp
+ ${CRU_BASE_INCLUDE_DIR}/logger.hpp
+ ${CRU_BASE_INCLUDE_DIR}/pre_config.hpp
+ ${CRU_BASE_INCLUDE_DIR}/self_resolvable.hpp
+)
+target_include_directories(cru_base PUBLIC ${CRU_INCLUDE_DIR})
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