// 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__