aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-08-18 19:03:44 +0800
committerYuqian Yang <crupest@crupest.life>2025-08-18 19:03:44 +0800
commit09a0b595f26b83477826b1f2e49bdd4d9a4bcee1 (patch)
tree30d72345bdea998d0651dcb4841670e0f3f9a543
parentb53780b2106b0f233c48e27653336b8a629ca486 (diff)
downloadcru-09a0b595f26b83477826b1f2e49bdd4d9a4bcee1.tar.gz
cru-09a0b595f26b83477826b1f2e49bdd4d9a4bcee1.tar.bz2
cru-09a0b595f26b83477826b1f2e49bdd4d9a4bcee1.zip
Add logger cpp stream.
-rw-r--r--include/cru/base/Base.h10
-rw-r--r--include/cru/base/log/Logger.h31
-rw-r--r--src/base/log/Logger.cpp17
3 files changed, 57 insertions, 1 deletions
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 <memory>
#include <mutex>
#include <thread>
+#include <utility>
#include <vector>
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 <typename T>
+ LoggerCppStream& operator<<(T&& arg) {
+ this->Consume(ToString(std::forward<T>(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 <ctime>
#include <algorithm>
+#include <ctime>
#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