From d6f949d502c4ef353af2467cead409160e01fbee Mon Sep 17 00:00:00 2001 From: Nomango Date: Mon, 20 Jul 2020 00:26:00 +0800 Subject: [PATCH] [deploy] update Logger --- src/kiwano/utils/Logger.cpp | 52 ++++++++++++++++++++++--------------- src/kiwano/utils/Logger.h | 21 ++++++++------- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/kiwano/utils/Logger.cpp b/src/kiwano/utils/Logger.cpp index 692ab4c0..b00fba8b 100644 --- a/src/kiwano/utils/Logger.cpp +++ b/src/kiwano/utils/Logger.cpp @@ -53,7 +53,7 @@ String LogFormater::GetLevelLabel(LogLevel level) const class TextFormater : public LogFormater { public: - void Format(std::iostream& out, LogLevel level, Time time, std::streambuf* raw_msg) override + void FormatHeader(std::ostream& out, LogLevel level, Time time) override { // get timestamp time_t unix = std::time(nullptr); @@ -62,10 +62,10 @@ public: // build message out << GetLevelLabel(level) << std::put_time(&tmbuf, " %H:%M:%S "); + } - if (raw_msg->sgetc() != std::char_traits::eof()) - out << raw_msg; - + void FormatFooter(std::ostream& out, LogLevel level, Time time) override + { out << "\n"; } }; @@ -498,6 +498,7 @@ Logger::Logger() : enabled_(true) , level_(LogLevel::Debug) , buffer_(1024) + , stream_(&buffer_) { LogFormaterPtr formater = new TextFormater; SetFormater(formater); @@ -506,6 +507,23 @@ Logger::Logger() AddProvider(provider); } +std::iostream& Logger::GetFormatedStream(LogLevel level, LogBuffer* buffer) +{ + std::lock_guard lock(mutex_); + + // reset buffer + buffer->Reset(); + + stream_.rdbuf(buffer); + stream_.clear(); + + if (formater_) + { + formater_->FormatHeader(stream_, level, Time::Now()); + } + return stream_; +} + Logger::~Logger() { } @@ -518,17 +536,17 @@ void Logger::Logf(LogLevel level, const char* format, ...) if (level < level_) return; - // build message va_list args = nullptr; va_start(args, format); - StringStream sstream; - sstream << strings::FormatArgs(format, args); + // build message + auto& stream = this->GetFormatedStream(level, &buffer_); + stream << strings::FormatArgs(format, args); va_end(args); // write message - Write(level, sstream.rdbuf()); + WriteToProviders(level, &buffer_); } void Logger::Flush() @@ -566,29 +584,21 @@ void Logger::ResizeBuffer(size_t buffer_size) buffer_.Resize(buffer_size); } -void Logger::Write(LogLevel level, std::streambuf* raw_msg) +void Logger::WriteToProviders(LogLevel level, LogBuffer* buffer) { std::lock_guard lock(mutex_); - // reset buffer - buffer_.Reset(); - - // format message - std::iostream stream(&buffer_); + // format footer if (formater_) { - formater_->Format(stream, level, Time::Now(), raw_msg); - } - else - { - stream << raw_msg << "\n"; + formater_->FormatFooter(stream_, level, Time::Now()); } // write message for (auto provider : providers_) { - buffer_.pubseekpos(0, std::ios_base::in); - provider->Write(level, &buffer_); + buffer->pubseekpos(0, std::ios_base::in); + provider->Write(level, buffer); } } diff --git a/src/kiwano/utils/Logger.h b/src/kiwano/utils/Logger.h index db299874..bd160454 100644 --- a/src/kiwano/utils/Logger.h +++ b/src/kiwano/utils/Logger.h @@ -101,7 +101,9 @@ enum class LogLevel class KGE_API LogFormater : public ObjectBase { public: - virtual void Format(std::iostream& out, LogLevel level, Time time, std::streambuf* raw_msg) = 0; + virtual void FormatHeader(std::ostream& out, LogLevel level, Time time) = 0; + + virtual void FormatFooter(std::ostream& out, LogLevel level, Time time) = 0; String GetLevelLabel(LogLevel level) const; }; @@ -270,12 +272,6 @@ public: /// @param buffer_size 缓冲区大小 void ResizeBuffer(size_t buffer_size); - /// \~chinese - /// @brief 写入缓冲区 - /// @param level 日志等级 - /// @param raw_msg 日志内容 - void Write(LogLevel level, std::streambuf* raw_msg); - /// \~chinese /// @brief 显示或关闭控制台 void ShowConsole(bool show); @@ -285,11 +281,16 @@ public: private: Logger(); + std::iostream& GetFormatedStream(LogLevel level, LogBuffer* buffer); + + void WriteToProviders(LogLevel level, LogBuffer* buffer); + private: bool enabled_; LogLevel level_; LogFormaterPtr formater_; LogBuffer buffer_; + std::iostream stream_; Vector providers_; std::mutex mutex_; }; @@ -319,11 +320,11 @@ inline void Logger::Log(LogLevel level, _Args&&... args) return; // build message - StringStream sstream; - (void)std::initializer_list{ ((sstream << ' ' << args), 0)... }; + auto& stream = this->GetFormatedStream(level, &this->buffer_); + (void)std::initializer_list{ ((stream << ' ' << args), 0)... }; // write message - this->Write(level, sstream.rdbuf()); + this->WriteToProviders(level, &this->buffer_); } } // namespace kiwano