// Taken from here: http://www.drdobbs.com/cpp/logging-in-c/201804215 // Original author: Petru Marginean // Modified by: Czarek Tomczak // Usage: // LOG_DEBUG #include #include #include "DebugLog.h" inline std::string NowTime(); enum TLogLevel {logERROR, logWARNING, logINFO, logDEBUG, logDEBUG1, logDEBUG2, logDEBUG3, logDEBUG4}; template class Log { public: Log(); virtual ~Log(); std::ostringstream& Get(TLogLevel level = logINFO); public: static TLogLevel& ReportingLevel(); static std::string ToString(TLogLevel level); static TLogLevel FromString(const std::string& level); protected: std::ostringstream os; private: Log(const Log&); Log& operator =(const Log&); }; template Log::Log() { } template std::ostringstream& Log::Get(TLogLevel level) { // os logDEBUG ? level - logDEBUG : 0, '\t'); return os; } template Log::~Log() { os TLogLevel& Log::ReportingLevel() { static TLogLevel reportingLevel = logDEBUG4; return reportingLevel; } template std::string Log::ToString(TLogLevel level) { static const char* const buffer[] = {"ERROR", "WARNING", "INFO", "DEBUG", "DEBUG1", "DEBUG2", "DEBUG3", "DEBUG4"}; return buffer[level]; } template TLogLevel Log::FromString(const std::string& level) { if (level == "DEBUG4") return logDEBUG4; if (level == "DEBUG3") return logDEBUG3; if (level == "DEBUG2") return logDEBUG2; if (level == "DEBUG1") return logDEBUG1; if (level == "DEBUG") return logDEBUG; if (level == "INFO") return logINFO; if (level == "WARNING") return logWARNING; if (level == "ERROR") return logERROR; Log().Get(logWARNING) {}; //typedef Log FILELog; #ifndef FILELOG_MAX_LEVEL #define FILELOG_MAX_LEVEL logDEBUG4 #endif // Name conflits with cef_logging.h, see: // https://bitbucket.org/chromiumembedded/cef/issues/1830 // LOG, LOG_ERROR, LOG_WARNING and LOG_INFO are already defined // in cef_logging.h and must not be used here. So far we've only // used LOG_DEBUG in code. #define CEFPYTHON_LOG(level) \ if (level > FILELOG_MAX_LEVEL) ;\ else if (level > FILELog::ReportingLevel() || !Output2FILE::Stream()) ; \ else FILELog().Get(level) \ // #define LOG_ERROR LOG(logERROR) // #define LOG_WARNING LOG(logWARNING) // #define LOG_INFO LOG(logINFO) #define LOG_DEBUG CEFPYTHON_LOG(logDEBUG) #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) #include inline std::string NowTime() { const int MAX_LEN = 200; char buffer[MAX_LEN]; if (GetTimeFormatA(LOCALE_USER_DEFAULT, 0, 0, "HH':'mm':'ss", buffer, MAX_LEN) == 0) return "Error in NowTime()"; char result[100] = {0}; static DWORD first = GetTickCount(); #pragma warning(suppress: 4996) sprintf(result, "%s.%03ld", buffer, (long)(GetTickCount() - first) % 1000); return result; } #else #include inline std::string NowTime() { char buffer[11]; time_t t; time(&t); tm r = {0}; strftime(buffer, sizeof(buffer), "%X", localtime_r(&t, &r)); struct timeval tv; gettimeofday(&tv, 0); char result[100] = {0}; sprintf(result, "%s.%03ld", buffer, (long)tv.tv_usec / 1000); return result; } #endif //WIN32 #endif //__LOG_DEBUG_H__