[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
{
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<char>::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<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()
{
}
@ -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<std::mutex> 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);
}
}

View File

@ -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<LogProviderPtr> 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<int>{ ((sstream << ' ' << args), 0)... };
auto& stream = this->GetFormatedStream(level, &this->buffer_);
(void)std::initializer_list<int>{ ((stream << ' ' << args), 0)... };
// write message
this->Write(level, sstream.rdbuf());
this->WriteToProviders(level, &this->buffer_);
}
} // namespace kiwano