Nymph  v1.5.2
Flow-Based Data Processing Framework
KTLogger.cc
Go to the documentation of this file.
1 /*
2  * KTLogger.cc
3  *
4  * Created on: Jan 21, 2014
5  * Author: nsoblath
6  */
7 
8 /*
9  * KTLogger.cc
10  * based on KLogger.cxx from KATRIN's Kasper
11  *
12  * Created on: 18.11.2011
13  * Author: Marco Haag <marco.haag@kit.edu>
14  */
15 
16 #include "KTLogger.hh"
17 
18 #include <algorithm>
19 #include <cstdio>
20 #include <cstdlib>
21 #include <cstring>
22 #include <iomanip>
23 #include <iterator>
24 #include <sys/time.h>
25 #include <time.h>
26 
27 using namespace std;
28 
29 namespace Nymph
30 {
31  const string& EndColor() {static string* color = new string(KTCOLOR_PREFIX KTCOLOR_NORMAL KTCOLOR_SUFFIX); return *color;}
32  const string& FatalColor() {static string* color = new string(KTCOLOR_PREFIX KTCOLOR_BRIGHT KTCOLOR_SEPARATOR KTCOLOR_FOREGROUND_RED KTCOLOR_SUFFIX); return *color;}
33  const string& ErrorColor() {static string* color = new string(KTCOLOR_PREFIX KTCOLOR_BRIGHT KTCOLOR_SEPARATOR KTCOLOR_FOREGROUND_RED KTCOLOR_SUFFIX); return *color;}
34  const string& WarnColor() {static string* color = new string(KTCOLOR_PREFIX KTCOLOR_BRIGHT KTCOLOR_SEPARATOR KTCOLOR_FOREGROUND_YELLOW KTCOLOR_SUFFIX); return *color;}
35  const string& ProgColor() {static string* color = new string(KTCOLOR_PREFIX KTCOLOR_BRIGHT KTCOLOR_SEPARATOR KTCOLOR_FOREGROUND_BLUE KTCOLOR_SUFFIX); return *color;}
36  const string& InfoColor() {static string* color = new string(KTCOLOR_PREFIX KTCOLOR_BRIGHT KTCOLOR_SEPARATOR KTCOLOR_FOREGROUND_GREEN KTCOLOR_SUFFIX); return *color;}
37  const string& DebugColor() {static string* color = new string(KTCOLOR_PREFIX KTCOLOR_BRIGHT KTCOLOR_SEPARATOR KTCOLOR_FOREGROUND_CYAN KTCOLOR_SUFFIX); return *color;}
38  const string& OtherColor() {static string* color = new string(KTCOLOR_PREFIX KTCOLOR_BRIGHT KTCOLOR_SEPARATOR KTCOLOR_FOREGROUND_WHITE KTCOLOR_SUFFIX); return *color;}
39 
41  {
42  static char sDateTimeFormat[16];
43  static time_t sRawTime;
44  static tm* sProcessedTime;
45  static char sTimeBuff[512];
46  static size_t getTimeAbsoluteStr()
47  {
48  time(&KTLogger::Private::sRawTime);
49  sProcessedTime = localtime(&KTLogger::Private::sRawTime);
50  return strftime(KTLogger::Private::sTimeBuff, 512,
51  KTLogger::Private::sDateTimeFormat,
52  KTLogger::Private::sProcessedTime);
53  }
54 
55  const char* fLogger;
56  bool fColored;
58 
59  static const char* level2Str(ELevel level)
60  {
61  switch(level)
62  {
63  case eTrace : return "TRACE"; break;
64  case eDebug : return "DEBUG"; break;
65  case eInfo : return "INFO"; break;
66  case eProg : return "PROG"; break;
67  case eWarn : return "WARN"; break;
68  case eError : return "ERROR"; break;
69  case eFatal : return "FATAL"; break;
70  default : return "XXX";
71  }
72  }
73 
74  static string level2Color(ELevel level)
75  {
76  switch(level)
77  {
78  case eTrace : return DebugColor(); break;
79  case eDebug : return DebugColor(); break;
80  case eInfo : return InfoColor(); break;
81  case eProg : return ProgColor(); break;
82  case eWarn : return WarnColor(); break;
83  case eError : return ErrorColor(); break;
84  case eFatal : return FatalColor(); break;
85  default : return OtherColor();
86  }
87  }
88 
89 
90  void logCout(ELevel level, const string& message, const Location& loc)
91  {
92  getTimeAbsoluteStr();
93  if (fColored)
94  {
95  //cout << color << KTLogger::Private::sTimeBuff << " [" << setw(5) << level << "] " << setw(16) << left << loc.fFileName << "(" << loc.fLineNumber << "): " << message << skKTEndColor << endl;
96  cout << Private::level2Color(level) << KTLogger::Private::sTimeBuff << " [" << setw(5) << Private::level2Str(level) << "] ";
97  copy(loc.fFileName.end() - std::min< int >(loc.fFileName.size(), 16), loc.fFileName.end(), ostream_iterator<char>(cout));
98  cout << "(" << loc.fLineNumber << "): ";
99  cout << message << EndColor() << endl;
100  }
101  else
102  {
103  //cout << KTLogger::Private::sTimeBuff << " [" << setw(5) << level << "] " << setw(16) << left << loc.fFileName << "(" << loc.fLineNumber << "): " << message << endl;
104  cout << KTLogger::Private::sTimeBuff << " [" << setw(5) << level << "] ";
105  copy(loc.fFileName.end() - std::min< int >(loc.fFileName.size(), 16), loc.fFileName.end(), ostream_iterator<char>(cout));
106  cout << "(" << loc.fLineNumber << "): ";
107  cout << message << endl;
108  }
109  }
110 
111  void logCerr(ELevel level, const string& message, const Location& loc)
112  {
113  getTimeAbsoluteStr();
114  if (fColored)
115  {
116  //cout << color << KTLogger::Private::sTimeBuff << " [" << setw(5) << level << "] " << setw(16) << left << loc.fFileName << "(" << loc.fLineNumber << "): " << message << skKTEndColor << endl;
117  cerr << Private::level2Color(level) << KTLogger::Private::sTimeBuff << " [" << setw(5) << Private::level2Str(level) << "] ";
118  copy(loc.fFileName.end() - std::min< int >(loc.fFileName.size(), 16), loc.fFileName.end(), ostream_iterator<char>(cout));
119  cerr << "(" << loc.fLineNumber << "): ";
120  cerr << message << EndColor() << endl;
121  }
122  else
123  {
124  //cout << KTLogger::Private::sTimeBuff << " [" << setw(5) << level << "] " << setw(16) << left << loc.fFileName << "(" << loc.fLineNumber << "): " << message << endl;
125  cerr << KTLogger::Private::sTimeBuff << " [" << setw(5) << Private::level2Str(level) << "] ";
126  copy(loc.fFileName.end() - std::min< int >(loc.fFileName.size(), 16), loc.fFileName.end(), ostream_iterator<char>(cout));
127  cerr << "(" << loc.fLineNumber << "): ";
128  cerr << message << endl;
129  }
130  }
131  };
132 
133  char KTLogger::Private::sDateTimeFormat[16];
134  time_t KTLogger::Private::sRawTime;
135  tm* KTLogger::Private::sProcessedTime;
136  char KTLogger::Private::sTimeBuff[512];
137 
138  KTLogger::KTLogger(const char* name) : fPrivate(new Private())
139  {
140  if (name == 0)
141  {
142  fPrivate->fLogger = "root";
143  }
144  else
145  {
146  const char* logName = strrchr(name, '/') ? strrchr(name, '/') + 1 : name;
147  fPrivate->fLogger = logName;
148  }
149  fPrivate->fColored = true;
150  sprintf(KTLogger::Private::sDateTimeFormat, "%%T");
151  SetLevel(eDebug);
152  }
153 
154  KTLogger::KTLogger(const std::string& name) : fPrivate(new Private())
155  {
156  fPrivate->fLogger = name.c_str();
157  fPrivate->fColored = true;
158  sprintf(KTLogger::Private::sDateTimeFormat, "%%T");
159  SetLevel(eDebug);
160  }
161 
163  {
164  delete fPrivate;
165  }
166 
168  {
169  return level >= fPrivate->fThreshold;
170  }
171 
172  void KTLogger::SetLevel(ELevel level) const
173  {
174 #if defined(NDEBUG) && defined(STANDARD)
175  fPrivate->fThreshold = level >= eInfo ? level : eInfo;
176 #elif defined(NDEBUG)
177  fPrivate->fThreshold = level >= eProg ? level : eProg;
178 #else
179  fPrivate->fThreshold = level;
180 #endif
181  }
182 
183  void KTLogger::Log(ELevel level, const string& message, const Location& loc)
184  {
185  if (level >= eWarn)
186  {
187  fPrivate->logCerr(level, message, loc);
188  }
189  else
190  {
191  fPrivate->logCout(level, message, loc);
192  }
193  }
194 }
195 
#define KTCOLOR_SUFFIX
Definition: KTLogger.hh:62
static tm * sProcessedTime
Definition: KTLogger.cc:44
const string & ProgColor()
Definition: KTLogger.cc:35
#define KTCOLOR_NORMAL
Definition: KTLogger.hh:53
const string & FatalColor()
Definition: KTLogger.cc:32
static size_t getTimeAbsoluteStr()
Definition: KTLogger.cc:46
const string & WarnColor()
Definition: KTLogger.cc:34
virtual ~KTLogger()
Definition: KTLogger.cc:162
bool IsLevelEnabled(ELevel level) const
Definition: KTLogger.cc:167
STL namespace.
const char * fLogger
Definition: KTLogger.cc:55
#define KTCOLOR_FOREGROUND_RED
Definition: KTLogger.hh:55
#define KTCOLOR_SEPARATOR
Definition: KTLogger.hh:63
const string & OtherColor()
Definition: KTLogger.cc:38
KTLogger(const char *name=0)
Definition: KTLogger.cc:138
static string level2Color(ELevel level)
Definition: KTLogger.cc:74
void SetLevel(ELevel level) const
Definition: KTLogger.cc:172
const string & InfoColor()
Definition: KTLogger.cc:36
#define KTCOLOR_BRIGHT
Definition: KTLogger.hh:54
const string & ErrorColor()
Definition: KTLogger.cc:33
#define KTCOLOR_FOREGROUND_YELLOW
Definition: KTLogger.hh:57
const string & DebugColor()
Definition: KTLogger.cc:37
void Log(ELevel level, const std::string &message, const Location &loc=Location())
Definition: KTLogger.cc:183
const string & EndColor()
Definition: KTLogger.cc:31
static time_t sRawTime
Definition: KTLogger.cc:43
void logCout(ELevel level, const string &message, const Location &loc)
Definition: KTLogger.cc:90
#define KTCOLOR_FOREGROUND_GREEN
Definition: KTLogger.hh:56
#define KTCOLOR_FOREGROUND_WHITE
Definition: KTLogger.hh:60
void logCerr(ELevel level, const string &message, const Location &loc)
Definition: KTLogger.cc:111
#define KTCOLOR_PREFIX
Definition: KTLogger.hh:61
static const char * level2Str(ELevel level)
Definition: KTLogger.cc:59
Private * fPrivate
Definition: KTLogger.hh:253
#define KTCOLOR_FOREGROUND_CYAN
Definition: KTLogger.hh:59
#define KTCOLOR_FOREGROUND_BLUE
Definition: KTLogger.hh:58
Contains the logger class and macros, based on Kasper&#39;s KLogger class.