Scarab  v2.4.6
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 #include "scarab_api.hh"
14 
23 // UTILITY MACROS
24 
25 #ifndef LOGGER_UTILITY_MACROS_
26 #define LOGGER_UTILITY_MACROS_
27 
28 #define msvc_bug_fix(m, args) m args
29 #define expand(x) x
30 
31 //#define va_num_args(...) va_num_args_(__VA_ARGS__, 5,4,3,2,1)
32 //#define va_num_args_(...) msvc_bug_fix(va_num_args_impl, (__VA_ARGS__))
33 #define va_num_args(...) expand( va_num_args_impl(__VA_ARGS__, 5,4,3,2,1))
34 #define va_num_args_impl(_1,_2,_3,_4,_5,N,...) N
35 
36 
37 #define macro_dispatcher(func, ...) macro_dispatcher_(func, va_num_args(__VA_ARGS__))
38 #define macro_dispatcher_(func, nargs) macro_dispatcher__(func, nargs)
39 #define macro_dispatcher__(func, nargs) func ## nargs
40 
41 #endif /* LOGGER_UTILITY_MACROS_ */
42 
43 // COLOR DEFINITIONS
44 #define COLOR_NORMAL "0"
45 #define COLOR_BRIGHT "1"
46 #define COLOR_FOREGROUND_RED "31"
47 #define COLOR_FOREGROUND_GREEN "32"
48 #define COLOR_FOREGROUND_YELLOW "33"
49 #define COLOR_FOREGROUND_BLUE "34"
50 #define COLOR_FOREGROUND_CYAN "36"
51 #define COLOR_FOREGROUND_WHITE "37"
52 #define COLOR_PREFIX "\033["
53 #define COLOR_SUFFIX "m"
54 #define COLOR_SEPARATOR ";"
55 
56 // INCLUDES
57 
58 #include <cstring>
59 #include <iostream>
60 #include <sstream>
61 
62 // CLASS DEFINITIONS
63 
67 namespace scarab
68 {
69 
113  {
114  public:
115  enum ELevel {
116  eTrace = 0,
117  eDebug = 1,
118  eInfo = 2,
119  eProg = 3,
120  eWarn = 4,
121  eError = 5,
122  eFatal = 6
123  };
124 
125  public:
130  struct Location {
131  Location(const char* const fileName = "", const char* const functionName = "", int lineNumber = -1) :
132  fLineNumber(lineNumber), fFileName(fileName), fFunctionName(functionName)
133  { }
135  std::string fFileName;
136  std::string fFunctionName;
137  };
138 
139  public:
140  static logger& GetRootLogger() {
141  static logger rootLogger;
142  return rootLogger;
143  }
144 
145  public:
150  logger(const char* name = 0);
152  logger(const std::string& name);
153 
154  virtual ~logger();
155 
161  bool IsLevelEnabled(ELevel level) const;
162 
167  void SetLevel(ELevel level) const;
168 
173  void SetGlobalLevel(ELevel level) const;
174 
179  static void SetColored(bool flag);
180 
185  static void SetOutStream(std::ostream* stream);
186 
191  static void SetErrStream(std::ostream* stream);
192 
200  void Log(ELevel level, const std::string& message, const Location& loc = Location());
201 
208  void LogTrace(const std::string& message, const Location& loc = Location())
209  {
210  Log(eTrace, message, loc);
211  }
218  void LogDebug(const std::string& message, const Location& loc = Location())
219  {
220  Log(eDebug, message, loc);
221  }
228  void LogInfo(const std::string& message, const Location& loc = Location())
229  {
230  Log(eInfo, message, loc);
231  }
238  void LogProg(const std::string& message, const Location& loc = Location())
239  {
240  Log(eProg, message, loc);
241  }
248  void LogWarn(const std::string& message, const Location& loc = Location())
249  {
250  Log(eWarn, message, loc);
251  }
258  void LogError(const std::string& message, const Location& loc = Location())
259  {
260  Log(eError, message, loc);
261  }
268  void LogFatal(const std::string& message, const Location& loc = Location())
269  {
270  Log(eFatal, message, loc);
271  }
272 
273  private:
274  struct Private;
275  Private* fPrivate;
276  };
277 
278 }
279 
280 // PRIVATE MACROS
281 
282 #define __DEFAULT_LOGGER scarab::logger::GetRootLogger()
283 
284 #define __LOG_LOCATION scarab::logger::Location(__FILE__, __FUNC__, __LINE__)
285 //#ifndef _WIN32
286 #define __LOG_LOG_4(I,L,M,O) \
287  { \
288  if (I.IsLevelEnabled(scarab::logger::e##L)) { \
289  static bool _sLoggerMarker = false; \
290  if (!O || !_sLoggerMarker) { \
291  _sLoggerMarker = true; \
292  std::ostringstream stream; stream << M; \
293  I.Log(scarab::logger::e##L, stream.str(), __LOG_LOCATION); \
294  } \
295  } \
296  }
297 //#else
298 //#define __LOG_LOG_4(I,L,M,O) \
299 // { }
300 //#endif
301 
302 
303 #define __LOG_LOG_3(I,L,M) __LOG_LOG_4(I,L,M,false)
304 #define __LOG_LOG_2(L,M) __LOG_LOG_4(__DEFAULT_LOGGER,L,M,false)
305 #define __LOG_LOG_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Debug,M,false)
306 
307 #define __LOG_TRACE_2(I,M) __LOG_LOG_4(I,Trace,M,false)
308 #define __LOG_TRACE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Trace,M,false)
309 
310 #define __LOG_DEBUG_2(I,M) __LOG_LOG_4(I,Debug,M,false)
311 #define __LOG_DEBUG_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Debug,M,false)
312 
313 #define __LOG_INFO_2(I,M) __LOG_LOG_4(I,Info,M,false)
314 #define __LOG_INFO_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Info,M,false)
315 
316 #define __LOG_PROG_2(I,M) __LOG_LOG_4(I,Prog,M,false)
317 #define __LOG_PROG_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Prog,M,false)
318 
319 #define __LOG_WARN_2(I,M) __LOG_LOG_4(I,Warn,M,false)
320 #define __LOG_WARN_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Warn,M,false)
321 
322 #define __LOG_ERROR_2(I,M) __LOG_LOG_4(I,Error,M,false)
323 #define __LOG_ERROR_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Error,M,false)
324 
325 #define __LOG_FATAL_2(I,M) __LOG_LOG_4(I,Fatal,M,false)
326 #define __LOG_FATAL_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Fatal,M,false)
327 
328 #define __LOG_ASSERT_3(I,C,M) if (!(C)) { __LOG_ERROR_2(I,M) }
329 #define __LOG_ASSERT_2(C,M) __LOG_ASSERT_3(__DEFAULT_LOGGER,C,M)
330 
331 
332 #define __LOG_LOG_ONCE_3(I,L,M) __LOG_LOG_4(I,L,M,true)
333 #define __LOG_LOG_ONCE_2(L,M) __LOG_LOG_4(__DEFAULT_LOGGER,L,M,true)
334 #define __LOG_LOG_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Debug,M,true)
335 
336 #define __LOG_TRACE_ONCE_2(I,M) __LOG_LOG_4(I,Trace,M,true)
337 #define __LOG_TRACE_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Trace,M,true)
338 
339 #define __LOG_DEBUG_ONCE_2(I,M) __LOG_LOG_4(I,Debug,M,true)
340 #define __LOG_DEBUG_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Debug,M,true)
341 
342 #define __LOG_INFO_ONCE_2(I,M) __LOG_LOG_4(I,Info,M,true)
343 #define __LOG_INFO_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Info,M,true)
344 
345 #define __LOG_PROG_ONCE_2(I,M) __LOG_LOG_4(I,Prog,M,true)
346 #define __LOG_PROG_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Prog,M,true)
347 
348 #define __LOG_WARN_ONCE_2(I,M) __LOG_LOG_4(I,Warn,M,true)
349 #define __LOG_WARN_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Warn,M,true)
350 
351 #define __LOG_ERROR_ONCE_2(I,M) __LOG_LOG_4(I,Error,M,true)
352 #define __LOG_ERROR_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Error,M,true)
353 
354 #define __LOG_FATAL_ONCE_2(I,M) __LOG_LOG_4(I,Fatal,M,true)
355 #define __LOG_FATAL_ONCE_1(M) __LOG_LOG_4(__DEFAULT_LOGGER,Fatal,M,true)
356 
357 
358 // PUBLIC MACROS
359 
360 #define LOGGER(I,K) static scarab::logger I(K);
361 
362 #ifndef _WIN32
363 
364 #define LOG(...) macro_dispatcher(__LOG_LOG_, __VA_ARGS__)(__VA_ARGS__)
365 #ifdef NDEBUG
366 #define LTRACE(...)
367 #define LDEBUG(...)
368 #else
369 #define LTRACE(...) macro_dispatcher(__LOG_TRACE_, __VA_ARGS__)(__VA_ARGS__)
370 #define LDEBUG(...) macro_dispatcher(__LOG_DEBUG_, __VA_ARGS__)(__VA_ARGS__)
371 #endif
372 #define LINFO(...) macro_dispatcher(__LOG_INFO_, __VA_ARGS__)(__VA_ARGS__)
373 #define LPROG(...) macro_dispatcher(__LOG_PROG_, __VA_ARGS__)(__VA_ARGS__)
374 #define LWARN(...) macro_dispatcher(__LOG_WARN_, __VA_ARGS__)(__VA_ARGS__)
375 #define LERROR(...) macro_dispatcher(__LOG_ERROR_, __VA_ARGS__)(__VA_ARGS__)
376 #define LFATAL(...) macro_dispatcher(__LOG_FATAL_, __VA_ARGS__)(__VA_ARGS__)
377 #define LASSERT(...) macro_dispatcher(__LOG_ASSERT_, __VA_ARGS__)(__VA_ARGS__)
378 
379 #define LOG_ONCE(...) macro_dispatcher(__LOG_LOG_ONCE_, __VA_ARGS__)(__VA_ARGS__)
380 #ifdef NDEBUG
381 #define LTRACE_ONCE(...)
382 #define LDEBUG_ONCE(...)
383 #else
384 #define LTRACE_ONCE(...) macro_dispatcher(__LOG_TRACE_ONCE_, __VA_ARGS__)(__VA_ARGS__)
385 #define LDEBUG_ONCE(...) macro_dispatcher(__LOG_DEBUG_ONCE_, __VA_ARGS__)(__VA_ARGS__)
386 #endif
387 #define LINFO_ONCE(...) macro_dispatcher(__LOG_INFO_ONCE_, __VA_ARGS__)(__VA_ARGS__)
388 #define LPROG_ONCE(...) macro_dispatcher(__LOG_PROG_ONCE_, __VA_ARGS__)(__VA_ARGS__)
389 #define LWARN_ONCE(...) macro_dispatcher(__LOG_WARN_ONCE_, __VA_ARGS__)(__VA_ARGS__)
390 #define LERROR_ONCE(...) macro_dispatcher(__LOG_ERROR_ONCE_, __VA_ARGS__)(__VA_ARGS__)
391 #define LFATAL_ONCE(...) macro_dispatcher(__LOG_FATAL_ONCE_, __VA_ARGS__)(__VA_ARGS__)
392 
393 #else /*_WIN32*/
394 
395 #define LOG(I, ...) __LOG_LOG_2(I, __VA_ARGS__)
396 #ifdef NDEBUG
397 #define LTRACE(I, ...)
398 #define LDEBUG(I, ...)
399 #else
400 #define LTRACE(I, ...) __LOG_TRACE_2(I, __VA_ARGS__)
401 #define LDEBUG(I, ...) __LOG_DEBUG_2(I, __VA_ARGS__)
402 #endif
403 #define LINFO(I, ...) __LOG_INFO_2(I, __VA_ARGS__)
404 #define LPROG(I, ...) __LOG_PROG_2(I, __VA_ARGS__)
405 #define LWARN(I, ...) __LOG_WARN_2(I, __VA_ARGS__)
406 #define LERROR(I, ...) __LOG_ERROR_2(I, __VA_ARGS__)
407 #define LFATAL(I, ...) __LOG_FATAL_2(I, __VA_ARGS__)
408 #define LASSERT(I, ...) __LOG_ASSERT_2(I, __VA_ARGS__)
409 
410 #define LOG_ONCE(I, ...) __LOG_LOG_ONCE_2(I, __VA_ARGS__)
411 #ifdef NDEBUG
412 #define LTRACE_ONCE(I, ...)
413 #define LDEBUG_ONCE(I, ...)
414 #else
415 #define LTRACE_ONCE(I, ...) __LOG_TRACE_ONCE_2(I, __VA_ARGS__)
416 #define LDEBUG_ONCE(I, ...) __LOG_DEBUG_ONCE_2(I, __VA_ARGS__)
417 #endif
418 #define LINFO_ONCE(I, ...) __LOG_INFO_ONCE_2(I, __VA_ARGS__)
419 #define LPROG_ONCE(I, ...) __LOG_PROG_ONCE_2(I, __VA_ARGS__)
420 #define LWARN_ONCE(I, ...) __LOG_WARN_ONCE_2(I, __VA_ARGS__)
421 #define LERROR_ONCE(I, ...) __LOG_ERROR_ONCE_2(I, __VA_ARGS__)
422 #define LFATAL_ONCE(I, ...) __LOG_FATAL_ONCE_2(I, __VA_ARGS__)
423 
424 #endif /*_WIN32*/
425 
426 #if 0
427 
428 #include <iostream>
429 #define LOGGER(I,K)
430 
431 #define LOG(I,K) std::cout << "LOG: " << K << std::endl;
432 #ifndef NDEBUG
433 #define LTRACE(I,K) std::cout << "TRACE: " << K << std::endl;
434 #define LDEBUG(I,K) std::cout << "DEBUG: " << K << std::endl;
435 #else
436 #define LTRACE(I,K)
437 #define LDEBUG(I,K)
438 #endif
439 #define LINFO(I,K) std::cout << "INFO: " << K << std::endl;
440 #define LPROG(I,K) std::cout << "PROG: " << K << std::endl;
441 #define LWARN(I,K) std::cout << "WARN: " << K << std::endl;
442 #define LERROR(I,K) std::cout << "ERROR: " << K << std::endl;
443 #define LFATAL(I,K) std::cout << "FATAL: " << K << std::endl;
444 #define LASSERT(I,K) std::cout << "ASSERT: " << K << std::endl;
445 
446 #define LOG_ONCE(I,K) std::cout << "LOG: " << K << std::endl;
447 #ifndef NDEBUG
448 #define LTRACE_ONCE(I,K) std::cout << "TRACE: " << K << std::endl;
449 #define LDEBUG_ONCE(I,K) std::cout << "DEBUG: " << K << std::endl;
450 #else
451 #define LTRACE_ONCE(I,K)
452 #define LDEBUG_ONCE(I,K)
453 #endif
454 #define LINFO_ONCE(I,K) std::cout << "INFO: " << K << std::endl;
455 #define LPROG_ONCE(I,K) std::cout << "PROG: " << K << std::endl;
456 #define LWARN_ONCE(I,K) std::cout << "WARN: " << K << std::endl;
457 #define LERROR_ONCE(I,K) std::cout << "ERROR: " << K << std::endl;
458 #define LFATAL_ONCE(I,K) std::cout << "FATAL: " << K << std::endl;
459 
460 #endif
461 
462 #endif /* SCARAB_LOGGER_HH_ */
std::string fFileName
Definition: logger.hh:135
std::string fFunctionName
Definition: logger.hh:136
static logger & GetRootLogger()
Definition: logger.hh:140
void LogWarn(const std::string &message, const Location &loc=Location())
Definition: logger.hh:248
void LogInfo(const std::string &message, const Location &loc=Location())
Definition: logger.hh:228
#define SCARAB_API
Definition: scarab_api.hh:24
void LogProg(const std::string &message, const Location &loc=Location())
Definition: logger.hh:238
void LogDebug(const std::string &message, const Location &loc=Location())
Definition: logger.hh:218
void LogTrace(const std::string &message, const Location &loc=Location())
Definition: logger.hh:208
Location(const char *const fileName="", const char *const functionName="", int lineNumber=-1)
Definition: logger.hh:131
Private * fPrivate
Definition: logger.hh:274
void LogFatal(const std::string &message, const Location &loc=Location())
Definition: logger.hh:268
void LogError(const std::string &message, const Location &loc=Location())
Definition: logger.hh:258