update LogFormater

This commit is contained in:
Nomango 2020-07-30 16:05:45 +08:00
parent a9c42d781f
commit 4911ee6977
2 changed files with 74 additions and 13 deletions

View File

@ -52,19 +52,80 @@ String LogFormater::GetLevelLabel(LogLevel level) const
class TextFormater : public LogFormater class TextFormater : public LogFormater
{ {
public: private:
void FormatHeader(std::ostream& out, LogLevel level, Time time) override struct TimeFormater
{ {
// get timestamp TimeFormater()
time_t unix = std::time(nullptr); {
std::tm tmbuf; time_t ctime = std::time(nullptr);
localtime_s(&tmbuf, &unix); prev_sec_ = ctime;
prev_min_ = ctime / 60;
// build message RefreshLocalTime(&ctime);
out << GetLevelLabel(level) << std::put_time(&tmbuf, " %H:%M:%S "); ResetFormat();
} }
void FormatFooter(std::ostream& out, LogLevel level, Time time) override const char* Format(ClockTime* current_time)
{
time_t ctime = current_time->GetCTime();
if (ctime != prev_sec_)
{
prev_sec_ = ctime;
tmbuf_.tm_sec = static_cast<int>(ctime % 60);
time_t ctime_min = ctime / 60;
if (ctime_min != prev_min_)
{
prev_min_ = ctime_min;
RefreshLocalTime(&ctime);
ResetFormat();
}
else
{
ResetFormatSec();
}
}
return time_format_;
}
private:
void ResetFormat()
{
std::snprintf(time_format_, 20, "%d-%02d-%02d %02d:%02d:%02d", tmbuf_.tm_year + 1900, tmbuf_.tm_mon + 1,
tmbuf_.tm_mday, tmbuf_.tm_hour, tmbuf_.tm_min, tmbuf_.tm_sec);
}
void ResetFormatSec()
{
std::snprintf(time_format_ + 17, 3, "%02d", tmbuf_.tm_sec);
}
void RefreshLocalTime(const time_t* ptime)
{
#if defined(KGE_PLATFORM_WINDOWS)
::localtime_s(&tmbuf_, ptime);
#else
std::tm* ptm = std::localtime(ptime);
::memcpy(&tmbuf_, ptm, sizeof(std::tm));
#endif
}
time_t prev_sec_ = 0;
time_t prev_min_ = 0;
std::tm tmbuf_ = {};
char time_format_[20] = {};
};
TimeFormater tf_;
public:
void FormatHeader(std::ostream& out, LogLevel level, ClockTime time) override
{
// build message
out << GetLevelLabel(level) << ' ' << tf_.Format(&time);
}
void FormatFooter(std::ostream& out, LogLevel level) override
{ {
out << "\n"; out << "\n";
} }
@ -510,7 +571,7 @@ std::iostream& Logger::GetFormatedStream(LogLevel level, LogBuffer* buffer)
if (formater_) if (formater_)
{ {
formater_->FormatHeader(stream_, level, Time::Now()); formater_->FormatHeader(stream_, level, ClockTime::Now());
} }
return stream_; return stream_;
} }
@ -534,7 +595,7 @@ void Logger::Logf(LogLevel level, const char* format, ...)
// build message // build message
auto& stream = this->GetFormatedStream(level, &buffer_); auto& stream = this->GetFormatedStream(level, &buffer_);
stream << strings::FormatArgs(format, args); stream << ' ' << strings::FormatArgs(format, args);
va_end(args); va_end(args);
@ -582,7 +643,7 @@ void Logger::WriteToProviders(LogLevel level, LogBuffer* buffer)
// format footer // format footer
if (formater_) if (formater_)
{ {
formater_->FormatFooter(stream_, level, Time::Now()); formater_->FormatFooter(stream_, level);
} }
// write message // write message

View File

@ -132,9 +132,9 @@ enum class LogLevel
class KGE_API LogFormater : public ObjectBase class KGE_API LogFormater : public ObjectBase
{ {
public: public:
virtual void FormatHeader(std::ostream& out, LogLevel level, Time time) = 0; virtual void FormatHeader(std::ostream& out, LogLevel level, ClockTime time) = 0;
virtual void FormatFooter(std::ostream& out, LogLevel level, Time time) = 0; virtual void FormatFooter(std::ostream& out, LogLevel level) = 0;
String GetLevelLabel(LogLevel level) const; String GetLevelLabel(LogLevel level) const;
}; };