From 09a0b595f26b83477826b1f2e49bdd4d9a4bcee1 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Mon, 18 Aug 2025 19:03:44 +0800 Subject: Add logger cpp stream. --- include/cru/base/Base.h | 10 ++++++++++ include/cru/base/log/Logger.h | 31 +++++++++++++++++++++++++++++++ src/base/log/Logger.cpp | 17 ++++++++++++++++- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/include/cru/base/Base.h b/include/cru/base/Base.h index b0d304e4..fd409360 100644 --- a/include/cru/base/Base.h +++ b/include/cru/base/Base.h @@ -75,6 +75,16 @@ class CRU_BASE_API Object { virtual ~Object() = default; }; +class CRU_BASE_API Object2 { + public: + Object2() = default; + Object2(const Object2&) = delete; + Object2& operator=(const Object2&) = delete; + Object2(Object2&&) = delete; + Object2& operator=(Object2&&) = delete; + virtual ~Object2() = default; +}; + struct CRU_BASE_API Interface { Interface() = default; CRU_DELETE_COPY(Interface) diff --git a/include/cru/base/log/Logger.h b/include/cru/base/log/Logger.h index 498ee1b4..f77296e1 100644 --- a/include/cru/base/log/Logger.h +++ b/include/cru/base/log/Logger.h @@ -8,6 +8,7 @@ #include #include #include +#include #include namespace cru::log { @@ -69,6 +70,36 @@ class CRU_BASE_API Logger : public Object { std::thread log_thread_; }; + +class CRU_BASE_API LoggerCppStream : public Object2 { + public: + explicit LoggerCppStream(Logger* logger, LogLevel level, String tag); + ~LoggerCppStream() override = default; + + LoggerCppStream WithLevel(LogLevel level) const; + LoggerCppStream WithTag(String tag) const; + + private: + void Consume(StringView str); + + public: + LoggerCppStream& operator<<(StringView str) { + this->Consume(str); + return *this; + } + + template + LoggerCppStream& operator<<(T&& arg) { + this->Consume(ToString(std::forward(arg))); + return *this; + } + + private: + Logger* logger_; + LogLevel level_; + String tag_; +}; + } // namespace cru::log #define CRU_LOG_TAG_DEBUG(...) \ diff --git a/src/base/log/Logger.cpp b/src/base/log/Logger.cpp index 86c65dbc..8aa8915c 100644 --- a/src/base/log/Logger.cpp +++ b/src/base/log/Logger.cpp @@ -1,8 +1,8 @@ #include "cru/base/log/Logger.h" #include "cru/base/log/StdioLogTarget.h" -#include #include +#include #ifdef CRU_PLATFORM_WINDOWS #include "cru/base/platform/win/DebugLogTarget.h" @@ -85,4 +85,19 @@ void Logger::Log(LogInfo log_info) { #endif log_queue_.Push(std::move(log_info)); } + +LoggerCppStream::LoggerCppStream(Logger *logger, LogLevel level, String tag) + : logger_(logger), level_(level), tag_(std::move(tag)) {} + +LoggerCppStream LoggerCppStream::WithLevel(LogLevel level) const { + return LoggerCppStream(this->logger_, level, this->tag_); +} + +LoggerCppStream LoggerCppStream::WithTag(String tag) const { + return LoggerCppStream(this->logger_, this->level_, std::move(tag)); +} + +void LoggerCppStream::Consume(StringView str) { + this->logger_->Log(this->level_, this->tag_, str.ToString()); +} } // namespace cru::log -- cgit v1.2.3