9 #define SCARAB_API_EXPORTS 48 static std::shared_ptr<LoggerSet> sAllLoggers = std::make_shared< LoggerSet >();
52 static char sDateTimeFormat[16];
55 static char sTimeBuff[512];
58 time(&logger::Private::sRawTime);
60 sProcessedTime = localtime(&logger::Private::sRawTime);
61 return strftime(logger::Private::sTimeBuff, 512,
62 logger::Private::sDateTimeFormat,
63 logger::Private::sProcessedTime);
80 static ELevel sGlobalThreshold = logger::Private::filterMinimumLevel(ELevel::eDebug);
81 return sGlobalThreshold;
88 case ELevel::eTrace :
return "TRACE";
break;
89 case ELevel::eDebug :
return "DEBUG";
break;
90 case ELevel::eInfo :
return "INFO";
break;
91 case ELevel::eProg :
return "PROG";
break;
92 case ELevel::eWarn :
return "WARN";
break;
93 case ELevel::eError :
return "ERROR";
break;
94 case ELevel::eFatal :
return "FATAL";
break;
95 default :
return "XXX";
103 case ELevel::eTrace :
return TraceColor();
break;
104 case ELevel::eDebug :
return DebugColor();
break;
105 case ELevel::eInfo :
return InfoColor();
break;
106 case ELevel::eProg :
return ProgColor();
break;
107 case ELevel::eWarn :
return WarnColor();
break;
108 case ELevel::eError :
return ErrorColor();
break;
109 case ELevel::eFatal :
return FatalColor();
break;
116 #if defined(NDEBUG) && defined(STANDARD) 117 return level >= ELevel::eInfo ? level : ELevel::eInfo;
118 #elif defined(NDEBUG) 119 return level >= ELevel::eProg ? level : ELevel::eProg;
128 logger::Private::sMutex.lock();
129 logger::Private::getTimeAbsoluteStr();
133 (*fOut) << Private::level2Color(level) << logger::Private::sTimeBuff <<
" [" << setw(5) << Private::level2Str(level) <<
"] ";
135 (*fOut) <<
"(tid " << std::this_thread::get_id() <<
") ";
139 (*fOut) << message <<
EndColor() << endl;
144 (*fOut) << logger::Private::sTimeBuff <<
" [" << setw(5) << Private::level2Str(level) <<
"] ";
146 (*fOut) <<
"(tid " << std::this_thread::get_id() <<
") ";
150 (*fOut) << message << endl;
152 logger::Private::sMutex.unlock();
157 logger::Private::sMutex.lock();
158 logger::Private::getTimeAbsoluteStr();
162 (*fErr) << Private::level2Color(level) << logger::Private::sTimeBuff <<
" [" << setw(5) << Private::level2Str(level) <<
"] ";
164 (*fErr) <<
"(tid " << std::this_thread::get_id() <<
") ";
168 (*fErr) << message <<
EndColor() << endl;
173 (*fErr) << logger::Private::sTimeBuff <<
" [" << setw(5) << Private::level2Str(level) <<
"] ";
175 (*fErr) <<
"(tid " << std::this_thread::get_id() <<
") ";
179 (*fErr) << message << endl;
181 logger::Private::sMutex.unlock();
185 mutex logger::Private::sMutex;
187 char logger::Private::sDateTimeFormat[16];
188 time_t logger::Private::sRawTime;
189 tm* logger::Private::sProcessedTime;
190 char logger::Private::sTimeBuff[512];
192 bool logger::Private::fColored =
true;
194 std::ostream* logger::Private::fOut = &cout;
195 std::ostream* logger::Private::fErr = &cerr;
198 logger::logger(
const char* name) : fPrivate(new
Private())
206 const char* logName = strrchr(name,
'/') ? strrchr(name,
'/') + 1 : name;
214 sprintf(logger::Private::sDateTimeFormat,
"%%Y-%%m-%%d %%T");
227 sprintf(logger::Private::sDateTimeFormat,
"%%Y-%%m-%%d %%T");
239 return level >=
fPrivate->fThreshold;
250 fPrivate->fThresholdIsGlobal =
false;
256 fPrivate->fThresholdIsGlobal =
true;
271 if( (*logIt)->fPrivate->fThresholdIsGlobal )
282 logger::Private::fColored = flag;
284 std::cerr <<
"Colored logging is not enabled in Windows" << std::endl;
291 logger::Private::fOut = stream;
297 logger::Private::fErr = stream;
305 fPrivate->logCerr(level, message, loc);
309 fPrivate->logCout(level, message, loc);
const string & TraceColor()
const string & OtherColor()
const string & EndColor()
void logCerr(ELevel level, const string &message, const Location &loc)
const string & FatalColor()
static size_t getTimeAbsoluteStr()
static std::ostream * fErr
static ELevel & GlobalThreshold()
void Log(ELevel level, const std::string &message, const Location &loc=Location())
#define COLOR_FOREGROUND_WHITE
static void SetColored(bool flag)
void UseGlobalLevel() const
Contains the logger class and macros, based on Kasper's KLogger class.
static const char * level2Str(ELevel level)
static string level2Color(ELevel level)
const string & ProgColor()
static void SetErrStream(std::ostream *stream)
logger(const char *name=0)
const string & ErrorColor()
static std::ostream * fOut
static ELevel filterMinimumLevel(ELevel level)
bool IsLevelEnabled(ELevel level) const
const string & DebugColor()
static std::shared_ptr< LoggerSet > AllLoggers()
const string & InfoColor()
void SetLevel(ELevel level) const
const string & WarnColor()
#define COLOR_FOREGROUND_GREEN
static tm * sProcessedTime
static logger::ELevel GetGlobalLevel()
static void SetOutStream(std::ostream *stream)
std::set< logger *> LoggerSet
#define COLOR_FOREGROUND_BLUE
#define COLOR_FOREGROUND_CYAN
#define COLOR_FOREGROUND_RED
std::shared_ptr< Private > fPrivate
static void SetGlobalLevel(ELevel level)
#define COLOR_FOREGROUND_YELLOW
void logCout(ELevel level, const string &message, const Location &loc)