diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/CMakeLists.txt | 13 | ||||
-rw-r--r-- | src/common/logger.cpp | 61 |
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 |