From 7c13194d5a78cb500b632b40da560ab2f6965f7b Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 6 May 2015 11:24:35 -0400 Subject: [PATCH] don't recalculate timestamp for each log message --- Log.cpp | 21 ++++++++++++++++++--- Log.h | 12 ++++++++---- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/Log.cpp b/Log.cpp index ac2ba756..2fccb7d6 100644 --- a/Log.cpp +++ b/Log.cpp @@ -1,5 +1,5 @@ -#include "Log.h" #include +#include "Log.h" Log * g_Log = nullptr; @@ -13,11 +13,26 @@ static const char * g_LogLevelStr[eNumLogLevels] = void LogMsg::Process() { - output << boost::posix_time::second_clock::local_time().time_of_day () << - "/" << g_LogLevelStr[level] << " - "; + auto& output = (log && log->GetLogStream ()) ? *log->GetLogStream () : std::cout; + if (log) + output << log->GetTimestamp (); + else + output << boost::posix_time::second_clock::local_time().time_of_day (); + output << "/" << g_LogLevelStr[level] << " - "; output << s.str(); } +const std::string& Log::GetTimestamp () +{ + auto ts = std::chrono::steady_clock::now (); + if (ts > m_LastTimestampUpdate + std::chrono::milliseconds (500)) // 0.5 second + { + m_LastTimestampUpdate = ts; + m_Timestamp = boost::posix_time::to_simple_string (boost::posix_time::second_clock::local_time().time_of_day ()); + } + return m_Timestamp; +} + void Log::Flush () { if (m_LogStream) diff --git a/Log.h b/Log.h index b77528c5..103b84ac 100644 --- a/Log.h +++ b/Log.h @@ -6,6 +6,7 @@ #include #include #include +#include #include "Queue.h" enum LogLevel @@ -17,13 +18,14 @@ enum LogLevel eNumLogLevels }; +class Log; struct LogMsg { std::stringstream s; - std::ostream& output; + Log * log; LogLevel level; - LogMsg (std::ostream& o = std::cout, LogLevel l = eLogInfo): output (o), level (l) {}; + LogMsg (Log * l = nullptr, LogLevel lv = eLogInfo): log (l), level (lv) {}; void Process(); }; @@ -38,6 +40,7 @@ class Log: public i2p::util::MsgQueue void SetLogFile (const std::string& fullFilePath); void SetLogStream (std::ostream * logStream); std::ostream * GetLogStream () const { return m_LogStream; }; + const std::string& GetTimestamp (); private: @@ -46,6 +49,8 @@ class Log: public i2p::util::MsgQueue private: std::ostream * m_LogStream; + std::string m_Timestamp; + std::chrono::steady_clock::time_point m_LastTimestampUpdate; }; extern Log * g_Log; @@ -95,8 +100,7 @@ void LogPrint (std::stringstream& s, TValue arg, TArgs... args) template void LogPrint (LogLevel level, TArgs... args) { - LogMsg * msg = (g_Log && g_Log->GetLogStream ()) ? new LogMsg (*g_Log->GetLogStream (), level) : - new LogMsg (std::cout, level); + LogMsg * msg = new LogMsg (g_Log, level); LogPrint (msg->s, args...); msg->s << std::endl; if (g_Log)