Scarab  v2.2.1
Project 8 C++ Utility Library
logger.hh
Go to the documentation of this file.
1 /*
2  * logger.hh
3  * Based on KLogger.h, from KATRIN's Kasper
4  *
5  * Created on: Jan 21, 2014
6  * Author: nsoblath
7  */
8 
9 #ifndef SCARAB_LOGGER_HH_
10 #define SCARAB_LOGGER_HH_
11 
12 #include "macros.hh"
13 
22 // UTILITY MACROS
23 
24 #ifndef LOGGER_UTILITY_MACROS_
25 #define LOGGER_UTILITY_MACROS_
26 
27 #define va_num_args(...) va_num_args_impl(__VA_ARGS__, 5,4,3,2,1)
28 #define va_num_args_impl(_1,_2,_3,_4,_5,N,...) N
29 
30 #define macro_dispatcher(func, ...) macro_dispatcher_(func, va_num_args(__VA_ARGS__))
31 #define macro_dispatcher_(func, nargs) macro_dispatcher__(func, nargs)
32 #define macro_dispatcher__(func, nargs) func ## nargs
33 
34 #endif /* LOGGER_UTILITY_MACROS_ */
35 
36 #ifndef _WIN32
37 
38 // COLOR DEFINITIONS
39 #define COLOR_NORMAL "0"
40 #define COLOR_BRIGHT "1"
41 #define COLOR_FOREGROUND_RED "31"
42 #define COLOR_FOREGROUND_GREEN "32"
43 #define COLOR_FOREGROUND_YELLOW "33"
44 #define COLOR_FOREGROUND_BLUE "34"
45 #define COLOR_FOREGROUND_CYAN "36"
46 #define COLOR_FOREGROUND_WHITE "37"
47 #define COLOR_PREFIX "\033["
48 #define COLOR_SUFFIX "m"
49 #define COLOR_SEPARATOR ";"
50 
51 // INCLUDES
52 
53 #include <cstring>
54 #include <iostream>
55 #include <sstream>
56 
57 // CLASS DEFINITIONS
58 
62 namespace scarab
63 {
64 
107  class logger
108  {
109  public:
110  enum ELevel {
111  eTrace = 0,
112  eDebug = 1,
113  eInfo = 2,
114  eProg = 3,
115  eWarn = 4,
116  eError = 5,
117  eFatal = 6
118  };
119 
120  public:
125  struct Location {
126  Location(const char* const fileName = "", const char* const functionName = "", int lineNumber = -1) :
127  fLineNumber(lineNumber), fFileName(fileName), fFunctionName(functionName)
128  { }
130  std::string fFileName;
131  std::string fFunctionName;
132  };
133 
134  public:
135  static logger& GetRootLogger() {
136  static logger rootLogger;
137  return rootLogger;
138  }
139 
140  public:
145  logger(const char* name = 0);
147  logger(const std::string& name);
148 
149  virtual ~logger();
150 
156  bool IsLevelEnabled(ELevel level) const;
157 
162  void SetLevel(ELevel level) const;
163 
168  void SetGlobalLevel(ELevel level) const;
169 
174  static void SetColored(bool flag);
175 
180  static void SetOutStream(std::ostream* stream);
181 
186  static void SetErrStream(std::ostream* stream);
187 
195  void Log(ELevel level, const std::string& message, const Location& loc = Location());
196 
203  void LogTrace(const std::string& message, const Location& loc = Location())
204  {
205  Log(eTrace, message, loc);
206  }
213  void LogDebug(const std::string& message, const Location& loc = Location())
214  {
215  Log(eDebug, message, loc);
216  }
223  void LogInfo(const std::string& message, const Location& loc = Location())
224  {
225  Log(eInfo, message, loc);
226  }
233  void LogProg(const std::string& message, const Location& loc = Location())
234  {
235  Log(eProg, message, loc);
236  }
243  void LogWarn(const std::string& message, const Location& loc = Location())
244  {
245  Log(eWarn, message, loc);
246  }
253  void LogError(const std::string& message, const Location& loc = Location())
254  {
255  Log(eError, message, loc);
256  }
263  void LogFatal(const std::string& message, const Location& loc = Location())
264  {
265  Log(eFatal, message, loc);
266  }
267 
268  private:
269  struct Private;
270  Private* fPrivate;
271  };
272 
273 }
274 
275 // PRIVATE MACROS
276 
277 #define __DEFAULT_LOGGER scarab::logger::GetRootLogger()
278 
279 #define __LOG_LOCATION scarab::logger::Location(__FILE__, __FUNC__, __LINE__)
280 #ifndef _WIN32
281 #define __LOG_LOG_4(I,L,M,O) \
282  { \
283  if (I.IsLevelEnabled(scarab::logger::e##L)) { \
284  static bool _sLoggerMarker = false; \
285  if (!O || !_sLoggerMarker) { \
286  _sLoggerMarker = true; \
287  std::ostringstream stream; stream << M; \
288  I.Log(scarab::logger::e##L, stream.str(), __LOG_LOCATION); \
289  } \
290  } \
291  }
292 #else
293 #define __LOG_LOG_4(I,L,M,O) \
294  { }
295 #endif
296 
297 
298 #define __LOG_LOG_3(I,L,M) __LOG_LOG_4(I,L,M,false)
299 #define __LOG_LOG_2(L,M) __LOG_LOG_4(__DEFAULT_LOGGER,L,M,false)
300 #define __LOG_LOG_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Debug,M,false)
301 
302 #define __LOG_TRACE_2(I,M) __LOG_LOG_4(I,Trace,M,false)
303 #define __LOG_TRACE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Trace,M,false)
304 
305 #define __LOG_DEBUG_2(I,M) __LOG_LOG_4(I,Debug,M,false)
306 #define __LOG_DEBUG_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Debug,M,false)
307 
308 #define __LOG_INFO_2(I,M) __LOG_LOG_4(I,Info,M,false)
309 #define __LOG_INFO_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Info,M,false)
310 
311 #define __LOG_PROG_2(I,M) __LOG_LOG_4(I,Prog,M,false)
312 #define __LOG_PROG_1(M) __LOG_LOG_4(__KTDEFAULT_LOGGER,Prog,M,false)
313 
314 #define __LOG_WARN_2(I,M) __LOG_LOG_4(I,Warn,M,false)
315 #define __LOG_WARN_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Warn,M,false)
316 
317 #define __LOG_ERROR_2(I,M) __LOG_LOG_4(I,Error,M,false)
318 #define __LOG_ERROR_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Error,M,false)
319 
320 #define __LOG_FATAL_2(I,M) __LOG_LOG_4(I,Fatal,M,false)
321 #define __LOG_FATAL_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Fatal,M,false)
322 
323 #define __LOG_ASSERT_3(I,C,M) if (!(C)) { __LOG_ERROR_2(I,M) }
324 #define __LOG_ASSERT_2(C,M) __LOG_ASSERT_3(__DEFAULT_LOGGER,C,M)
325 
326 
327 #define __LOG_LOG_ONCE_3(I,L,M) __LOG_LOG_4(I,L,M,true)
328 #define __LOG_LOG_ONCE_2(L,M) __LOG_LOG_4(__DEFAULT_LOGGER,L,M,true)
329 #define __LOG_LOG_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Debug,M,true)
330 
331 #define __LOG_TRACE_ONCE_2(I,M) __LOG_LOG_4(I,Trace,M,true)
332 #define __LOG_TRACE_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Trace,M,true)
333 
334 #define __LOG_DEBUG_ONCE_2(I,M) __LOG_LOG_4(I,Debug,M,true)
335 #define __LOG_DEBUG_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Debug,M,true)
336 
337 #define __LOG_INFO_ONCE_2(I,M) __LOG_LOG_4(I,Info,M,true)
338 #define __LOG_INFO_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Info,M,true)
339 
340 #define __LOG_WARN_ONCE_2(I,M) __LOG_LOG_4(I,Warn,M,true)
341 #define __LOG_WARN_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Warn,M,true)
342 
343 #define __LOG_ERROR_ONCE_2(I,M) __LOG_LOG_4(I,Error,M,true)
344 #define __LOG_ERROR_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Error,M,true)
345 
346 #define __LOG_FATAL_ONCE_2(I,M) __LOG_LOG_4(I,Fatal,M,true)
347 #define __LOG_FATAL_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Fatal,M,true)
348 
349 
350 // PUBLIC MACROS
351 
352 #define LOGGER(I,K) static scarab::logger I(K);
353 
354 #define LOG(...) macro_dispatcher(__LOG_LOG_, __VA_ARGS__)(__VA_ARGS__)
355 #ifdef NDEBUG
356 #define LTRACE(...)
357 #define LDEBUG(...)
358 #else
359 #define LTRACE(...) macro_dispatcher(__LOG_TRACE_, __VA_ARGS__)(__VA_ARGS__)
360 #define LDEBUG(...) macro_dispatcher(__LOG_DEBUG_, __VA_ARGS__)(__VA_ARGS__)
361 #endif
362 #define LINFO(...) macro_dispatcher(__LOG_INFO_, __VA_ARGS__)(__VA_ARGS__)
363 #define LPROG(...) macro_dispatcher(__LOG_PROG_, __VA_ARGS__)(__VA_ARGS__)
364 #define LWARN(...) macro_dispatcher(__LOG_WARN_, __VA_ARGS__)(__VA_ARGS__)
365 #define LERROR(...) macro_dispatcher(__LOG_ERROR_, __VA_ARGS__)(__VA_ARGS__)
366 #define LFATAL(...) macro_dispatcher(__LOG_FATAL_, __VA_ARGS__)(__VA_ARGS__)
367 #define LASSERT(...) macro_dispatcher(__LOG_ASSERT_, __VA_ARGS__)(__VA_ARGS__)
368 
369 #define LOG_ONCE(...) macro_dispatcher(__LOG_LOG_ONCE_, __VA_ARGS__)(__VA_ARGS__)
370 #ifdef NDEBUG
371 #define LTRACE_ONCE(...)
372 #define LDEBUG_ONCE(...)
373 #else
374 #define LTRACE_ONCE(...) macro_dispatcher(__LOG_TRACE_ONCE_, __VA_ARGS__)(__VA_ARGS__)
375 #define LDEBUG_ONCE(...) macro_dispatcher(__LOG_DEBUG_ONCE_, __VA_ARGS__)(__VA_ARGS__)
376 #endif
377 #define LINFO_ONCE(...) macro_dispatcher(__LOG_INFO_ONCE_, __VA_ARGS__)(__VA_ARGS__)
378 #define LPROG_ONCE(...) macro_dispatcher(__LOG_PROG_ONCE_, __VA_ARGS__)(__VA_ARGS__)
379 #define LWARN_ONCE(...) macro_dispatcher(__LOG_WARN_ONCE_, __VA_ARGS__)(__VA_ARGS__)
380 #define LERROR_ONCE(...) macro_dispatcher(__LOG_ERROR_ONCE_, __VA_ARGS__)(__VA_ARGS__)
381 #define LFATAL_ONCE(...) macro_dispatcher(__LOG_FATAL_ONCE_, __VA_ARGS__)(__VA_ARGS__)
382 
383 #else /*_WIN32*/
384 
385 #include <iostream>
386 #define LOGGER(I,K)
387 
388 #define LOG(I,K) std::cout << "LOG: " << K << std::endl;
389 #ifndef NDEBUG
390 #define LTRACE(I,K) std::cout << "TRACE: " << K << std::endl;
391 #define LDEBUG(I,K) std::cout << "DEBUG: " << K << std::endl;
392 #else
393 #define LTRACE(I,K)
394 #define LDEBUG(I,K)
395 #endif
396 #define LINFO(I,K) std::cout << "INFO: " << K << std::endl;
397 #define LPROG(I,K) std::cout << "PROG: " << K << std::endl;
398 #define LWARN(I,K) std::cout << "WARN: " << K << std::endl;
399 #define LERROR(I,K) std::cout << "ERROR: " << K << std::endl;
400 #define LFATAL(I,K) std::cout << "FATAL: " << K << std::endl;
401 #define LASSERT(I,K) std::cout << "ASSERT: " << K << std::endl;
402 
403 #define LOG_ONCE(I,K) std::cout << "LOG: " << K << std::endl;
404 #ifndef NDEBUG
405 #define LTRACE_ONCE(I,K) std::cout << "TRACE: " << K << std::endl;
406 #define LDEBUG_ONCE(I,K) std::cout << "DEBUG: " << K << std::endl;
407 #else
408 #define LTRACE_ONCE(I,K)
409 #define LDEBUG_ONCE(I,K)
410 #endif
411 #define LINFO_ONCE(I,K) std::cout << "INFO: " << K << std::endl;
412 #define LPROG_ONCE(I,K) std::cout << "PROG: " << K << std::endl;
413 #define LWARN_ONCE(I,K) std::cout << "WARN: " << K << std::endl;
414 #define LERROR_ONCE(I,K) std::cout << "ERROR: " << K << std::endl;
415 #define LFATAL_ONCE(I,K) std::cout << "FATAL: " << K << std::endl;
416 
417 #endif
418 
419 #endif /* SCARAB_LOGGER_HH_ */
std::string fFileName
Definition: logger.hh:130
std::string fFunctionName
Definition: logger.hh:131
static logger & GetRootLogger()
Definition: logger.hh:135
virtual ~logger()
Definition: logger.cc:208
void LogWarn(const std::string &message, const Location &loc=Location())
Definition: logger.hh:243
void SetGlobalLevel(ELevel level) const
Definition: logger.cc:229
void LogInfo(const std::string &message, const Location &loc=Location())
Definition: logger.hh:223
void Log(ELevel level, const std::string &message, const Location &loc=Location())
Definition: logger.cc:256
static void SetColored(bool flag)
Definition: logger.cc:238
static void SetErrStream(std::ostream *stream)
Definition: logger.cc:250
bool IsLevelEnabled(ELevel level) const
Definition: logger.cc:213
logger(const char *name=0)
Definition: logger.cc:182
void SetLevel(ELevel level) const
Definition: logger.cc:218
void LogProg(const std::string &message, const Location &loc=Location())
Definition: logger.hh:233
void LogDebug(const std::string &message, const Location &loc=Location())
Definition: logger.hh:213
void LogTrace(const std::string &message, const Location &loc=Location())
Definition: logger.hh:203
static void SetOutStream(std::ostream *stream)
Definition: logger.cc:244
Location(const char *const fileName="", const char *const functionName="", int lineNumber=-1)
Definition: logger.hh:126
Private * fPrivate
Definition: logger.hh:269
void LogFatal(const std::string &message, const Location &loc=Location())
Definition: logger.hh:263
void LogError(const std::string &message, const Location &loc=Location())
Definition: logger.hh:253