[deploy] update Logger

This commit is contained in:
Nomango 2020-07-20 00:26:00 +08:00
parent caaa86915d
commit d6f949d502
2 changed files with 42 additions and 31 deletions

View File

@ -53,7 +53,7 @@ String LogFormater::GetLevelLabel(LogLevel level) const
class TextFormater : public LogFormater class TextFormater : public LogFormater
{ {
public: 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 // get timestamp
time_t unix = std::time(nullptr); time_t unix = std::time(nullptr);
@ -62,10 +62,10 @@ public:
// build message // build message
out << GetLevelLabel(level) << std::put_time(&tmbuf, " %H:%M:%S "); out << GetLevelLabel(level) << std::put_time(&tmbuf, " %H:%M:%S ");
}
if (raw_msg->sgetc() != std::char_traits<char>::eof()) void FormatFooter(std::ostream& out, LogLevel level, Time time) override
out << raw_msg; {
out << "\n"; out << "\n";
} }
}; };
@ -498,6 +498,7 @@ Logger::Logger()
: enabled_(true) : enabled_(true)
, level_(LogLevel::Debug) , level_(LogLevel::Debug)
, buffer_(1024) , buffer_(1024)
, stream_(&buffer_)
{ {
LogFormaterPtr formater = new TextFormater; LogFormaterPtr formater = new TextFormater;
SetFormater(formater); SetFormater(formater);
@ -506,6 +507,23 @@ Logger::Logger()
AddProvider(provider); AddProvider(provider);
} }
std::iostream& Logger::GetFormatedStream(LogLevel level, LogBuffer* buffer)
{
std::lock_guard<std::mutex> lock(mutex_);
// reset buffer
buffer->Reset();
stream_.rdbuf(buffer);
stream_.clear();
if (formater_)
{
formater_->FormatHeader(stream_, level, Time::Now());
}
return stream_;
}
Logger::~Logger() Logger::~Logger()
{ {
} }
@ -518,17 +536,17 @@ void Logger::Logf(LogLevel level, const char* format, ...)
if (level < level_) if (level < level_)
return; return;
// build message
va_list args = nullptr; va_list args = nullptr;
va_start(args, format); va_start(args, format);
StringStream sstream; // build message
sstream << strings::FormatArgs(format, args); auto& stream = this->GetFormatedStream(level, &buffer_);
stream << strings::FormatArgs(format, args);
va_end(args); va_end(args);
// write message // write message
Write(level, sstream.rdbuf()); WriteToProviders(level, &buffer_);
} }
void Logger::Flush() void Logger::Flush()
@ -566,29 +584,21 @@ void Logger::ResizeBuffer(size_t buffer_size)
buffer_.Resize(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<std::mutex> lock(mutex_); std::lock_guard<std::mutex> lock(mutex_);
// reset buffer // format footer
buffer_.Reset();
// format message
std::iostream stream(&buffer_);
if (formater_) if (formater_)
{ {
formater_->Format(stream, level, Time::Now(), raw_msg); formater_->FormatFooter(stream_, level, Time::Now());
}
else
{
stream << raw_msg << "\n";
} }
// write message // write message
for (auto provider : providers_) for (auto provider : providers_)
{ {
buffer_.pubseekpos(0, std::ios_base::in); buffer->pubseekpos(0, std::ios_base::in);
provider->Write(level, &buffer_); provider->Write(level, buffer);
} }
} }

View File

@ -101,7 +101,9 @@ enum class LogLevel
class KGE_API LogFormater : public ObjectBase class KGE_API LogFormater : public ObjectBase
{ {
public: 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; String GetLevelLabel(LogLevel level) const;
}; };
@ -270,12 +272,6 @@ public:
/// @param buffer_size 缓冲区大小 /// @param buffer_size 缓冲区大小
void ResizeBuffer(size_t buffer_size); void ResizeBuffer(size_t buffer_size);
/// \~chinese
/// @brief 写入缓冲区
/// @param level 日志等级
/// @param raw_msg 日志内容
void Write(LogLevel level, std::streambuf* raw_msg);
/// \~chinese /// \~chinese
/// @brief 显示或关闭控制台 /// @brief 显示或关闭控制台
void ShowConsole(bool show); void ShowConsole(bool show);
@ -285,11 +281,16 @@ public:
private: private:
Logger(); Logger();
std::iostream& GetFormatedStream(LogLevel level, LogBuffer* buffer);
void WriteToProviders(LogLevel level, LogBuffer* buffer);
private: private:
bool enabled_; bool enabled_;
LogLevel level_; LogLevel level_;
LogFormaterPtr formater_; LogFormaterPtr formater_;
LogBuffer buffer_; LogBuffer buffer_;
std::iostream stream_;
Vector<LogProviderPtr> providers_; Vector<LogProviderPtr> providers_;
std::mutex mutex_; std::mutex mutex_;
}; };
@ -319,11 +320,11 @@ inline void Logger::Log(LogLevel level, _Args&&... args)
return; return;
// build message // build message
StringStream sstream; auto& stream = this->GetFormatedStream(level, &this->buffer_);
(void)std::initializer_list<int>{ ((sstream << ' ' << args), 0)... }; (void)std::initializer_list<int>{ ((stream << ' ' << args), 0)... };
// write message // write message
this->Write(level, sstream.rdbuf()); this->WriteToProviders(level, &this->buffer_);
} }
} // namespace kiwano } // namespace kiwano