9 #define SCARAB_API_EXPORTS 44 static unsigned sCount = 0;
50 static std::mutex sMutex;
58 static std::shared_ptr<LoggerSet> sAllLoggers = std::make_shared< LoggerSet >();
64 static char sDateTimeFormat[16];
66 return sDateTimeFormat;
71 static char sTimeBuff[512];
72 static time_t sRawTime;
73 static tm* sProcessedTime;
75 if( ! aGetNewTime )
return sTimeBuff;
79 sProcessedTime = localtime(&sRawTime);
80 strftime(sTimeBuff, 512, logger::Private::dateTimeFormat(), sProcessedTime);
91 static bool sColored =
true;
93 static bool sColored =
false;
98 static std::ostream*&
out()
100 static std::ostream* sOut = &std::cout;
104 static std::ostream*&
err()
106 static std::ostream* sErr = &std::cerr;
116 static ELevel sGlobalThreshold = logger::Private::filterMinimumLevel(ELevel::eDebug);
117 return sGlobalThreshold;
124 case ELevel::eTrace :
return "TRACE";
break;
125 case ELevel::eDebug :
return "DEBUG";
break;
126 case ELevel::eInfo :
return "INFO";
break;
127 case ELevel::eProg :
return "PROG";
break;
128 case ELevel::eWarn :
return "WARN";
break;
129 case ELevel::eError :
return "ERROR";
break;
130 case ELevel::eFatal :
return "FATAL";
break;
131 default :
return "XXX";
139 case ELevel::eTrace :
return TraceColor();
break;
140 case ELevel::eDebug :
return DebugColor();
break;
141 case ELevel::eInfo :
return InfoColor();
break;
142 case ELevel::eProg :
return ProgColor();
break;
143 case ELevel::eWarn :
return WarnColor();
break;
144 case ELevel::eError :
return ErrorColor();
break;
145 case ELevel::eFatal :
return FatalColor();
break;
152 #if defined(NDEBUG) && defined(STANDARD) 153 return level >= ELevel::eInfo ? level : ELevel::eInfo;
154 #elif defined(NDEBUG) 155 return level >= ELevel::eProg ? level : ELevel::eProg;
164 logger::Private::mutex().lock();
165 logger::Private::getTimeAbsoluteStr(
true );
166 if (logger::Private::colored())
169 *logger::Private::out() << Private::level2Color(level) << logger::Private::getTimeAbsoluteStr() <<
" [" << setw(5) << Private::level2Str(level) <<
"] ";
171 *logger::Private::out() <<
"(tid " << std::this_thread::get_id() <<
") ";
173 copy(loc.
fFileName.end() - std::min< int >(loc.
fFileName.size(), 16), loc.
fFileName.end(), ostream_iterator<char>(*logger::Private::out()));
174 *logger::Private::out() <<
"(" << loc.
fLineNumber <<
"): ";
175 *logger::Private::out() << message <<
EndColor() << endl;
180 *logger::Private::out() << logger::Private::getTimeAbsoluteStr() <<
" [" << setw(5) << Private::level2Str(level) <<
"] ";
182 *logger::Private::out() <<
"(tid " << std::this_thread::get_id() <<
") ";
184 copy(loc.
fFileName.end() - std::min< int >(loc.
fFileName.size(), 16), loc.
fFileName.end(), ostream_iterator<char>(*logger::Private::out()));
185 *logger::Private::out() <<
"(" << loc.
fLineNumber <<
"): ";
186 *logger::Private::out() << message << endl;
188 logger::Private::mutex().unlock();
193 logger::Private::mutex().lock();
194 logger::Private::getTimeAbsoluteStr();
195 if (logger::Private::colored())
198 *logger::Private::err() << Private::level2Color(level) << logger::Private::getTimeAbsoluteStr() <<
" [" << setw(5) << Private::level2Str(level) <<
"] ";
200 *logger::Private::err() <<
"(tid " << std::this_thread::get_id() <<
") ";
202 copy(loc.
fFileName.end() - std::min< int >(loc.
fFileName.size(), 16), loc.
fFileName.end(), ostream_iterator<char>(*logger::Private::err()));
203 *logger::Private::err() <<
"(" << loc.
fLineNumber <<
"): ";
204 *logger::Private::err() << message <<
EndColor() << endl;
209 *logger::Private::err() << logger::Private::getTimeAbsoluteStr() <<
" [" << setw(5) << Private::level2Str(level) <<
"] ";
211 *logger::Private::err() <<
"(tid " << std::this_thread::get_id() <<
") ";
213 copy(loc.
fFileName.end() - std::min< int >(loc.
fFileName.size(), 16), loc.
fFileName.end(), ostream_iterator<char>(*logger::Private::err()));
214 *logger::Private::err() <<
"(" << loc.
fLineNumber <<
"): ";
215 *logger::Private::err() << message << endl;
217 logger::Private::mutex().unlock();
222 logger::logger(
const char* name) : fPrivate(new
Private())
237 const char* logName = strrchr(name,
'/') ? strrchr(name,
'/') + 1 : name;
276 return level >=
fPrivate->fThreshold;
287 fPrivate->fThresholdIsGlobal =
false;
293 fPrivate->fThresholdIsGlobal =
true;
308 if( (*logIt)->fPrivate->fThresholdIsGlobal )
321 std::cerr <<
"Colored logging is not enabled in Windows" << std::endl;
342 fPrivate->logCerr(level, message, loc);
346 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 std::mutex & mutex()
static ELevel & GlobalThreshold()
static char * dateTimeFormat()
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 std::ostream *& out()
static const char * level2Str(ELevel level)
static string level2Color(ELevel level)
const string & ProgColor()
static void SetErrStream(std::ostream *stream)
static unsigned & count()
logger(const char *name=0)
const string & ErrorColor()
static ELevel filterMinimumLevel(ELevel level)
bool IsLevelEnabled(ELevel level) const
const string & DebugColor()
const string & InfoColor()
void SetLevel(ELevel level) const
const string & WarnColor()
#define COLOR_FOREGROUND_GREEN
static logger::ELevel GetGlobalLevel()
static void SetOutStream(std::ostream *stream)
std::set< logger *> LoggerSet
#define COLOR_FOREGROUND_BLUE
#define COLOR_FOREGROUND_CYAN
static std::ostream *& err()
#define COLOR_FOREGROUND_RED
static char * getTimeAbsoluteStr(bool aGetNewTime=false)
std::shared_ptr< Private > fPrivate
static void SetGlobalLevel(ELevel level)
#define COLOR_FOREGROUND_YELLOW
void logCout(ELevel level, const string &message, const Location &loc)
static std::shared_ptr< LoggerSet > & AllLoggers()