OpenLexocad  28.0
Log.h
Go to the documentation of this file.
1 #pragma once
2 #include <QTextStream>
3 
4 #include <iostream>
5 
6 
7 #define LOGGING_ENABLED
8 
9 namespace Base
10 {
12 {
13  D_OFF = 0,
14  D_FATAL = 1,
15  D_ERROR = 2,
16  D_WARN = 3,
17  D_INFO = 4,
18  D_DEBUG = 5,
19  D_ALL = 6
20 };
21 
22 LX_BASE_EXPORT void setLogLevel(LOGLEVEL);
23 LX_BASE_EXPORT LOGLEVEL getLogLevel();
24 
25 class LX_BASE_EXPORT LastError
26 {
27 public:
28  static LastError& Instance();
29  LastError& setError(std::string& where, std::string& msg);
30  LastError& setError(const char* where, const char* msg, ...);
31  LastError& append(std::string& msg);
32  std::string getError();
33  std::string getErrorMsg();
34  LastError() = default;
35 
36 private:
37  std::string m_where;
38  std::string m_msg;
39 };
40 
41 #define LASTERROR(msg, ...) Base::LastError::Instance().setError(__FUNCTION__, msg, __VA_ARGS__)
42 #define CLEARLASTERROR() Base::LastError::Instance().setError("", "")
43 
44 class LX_BASE_EXPORT ScopedLogger
45 {
46 public:
47  ScopedLogger(LOGLEVEL level, const std::string& s);
49 
50  static int getIndent();
51 
52  class ScopedLoggerP;
53  ScopedLoggerP* _piml;
54 };
55 
56 
58 {
59 public:
60  virtual ~LogBaseClass() = default;
61  virtual LogBaseClass& space() = 0;
62  virtual LogBaseClass& nospace() = 0;
63  virtual LogBaseClass& maybeSpace() = 0;
64  virtual LogBaseClass& operator<<(QChar t) = 0;
65  virtual LogBaseClass& operator<<(bool t) = 0;
66  virtual LogBaseClass& operator<<(char t) = 0;
67  virtual LogBaseClass& operator<<(signed short t) = 0;
68  virtual LogBaseClass& operator<<(unsigned short t) = 0;
69  virtual LogBaseClass& operator<<(signed int t) = 0;
70  virtual LogBaseClass& operator<<(unsigned int t) = 0;
71  virtual LogBaseClass& operator<<(signed long t) = 0;
72  virtual LogBaseClass& operator<<(unsigned long t) = 0;
73  virtual LogBaseClass& operator<<(qint64 t) = 0;
74  virtual LogBaseClass& operator<<(quint64 t) = 0;
75  virtual LogBaseClass& operator<<(float t) = 0;
76  virtual LogBaseClass& operator<<(double t) = 0;
77  virtual LogBaseClass& operator<<(const char* t) = 0;
78  virtual LogBaseClass& operator<<(const QString& t) = 0;
79  virtual LogBaseClass& operator<<(const QStringRef& t) = 0;
80  virtual LogBaseClass& operator<<(const QLatin1String& t) = 0;
81  virtual LogBaseClass& operator<<(const QByteArray& t) = 0;
82  virtual LogBaseClass& operator<<(const void* t) = 0;
83  virtual LogBaseClass& operator<<(QTextStreamFunction f) = 0;
84  virtual LogBaseClass& operator<<(QTextStreamManipulator m) = 0;
85 };
86 
88 {
89 public:
90  NoDebugClass& operator<<(QTextStreamFunction) { return *this; }
91  NoDebugClass& operator<<(QTextStreamManipulator) { return *this; }
92  NoDebugClass& space() { return *this; }
93  NoDebugClass& nospace() { return *this; }
94  NoDebugClass& maybeSpace() { return *this; }
95  NoDebugClass& quote() { return *this; }
96  NoDebugClass& noquote() { return *this; }
97  NoDebugClass& maybeQuote(const char = '"') { return *this; }
98 
99  template <typename T>
101  {
102  return *this;
103  }
104 };
105 
106 
107 class LX_BASE_EXPORT LogClass : public LogBaseClass
108 {
109  struct Stream
110  {
111  Stream(QIODevice* device) : ts(device), ref(1), type(QtDebugMsg), space(true), message_output(false) {}
112  Stream(QString* string) : ts(string, QIODevice::WriteOnly), ref(1), type(QtDebugMsg), space(true), message_output(false) {}
113  Stream(QtMsgType t) : ts(&buffer, QIODevice::WriteOnly), ref(1), type(t), space(true), message_output(true) {}
114  QTextStream ts;
115  QString buffer;
116  int ref;
117  QtMsgType type;
118  bool space;
119  bool message_output;
120  } * stream;
121 
122  LOGLEVEL mylevel;
123 #if QT_VERSION >= 0x050000
124  QMessageLogContext context;
125 #endif
126 
127 
128 public:
129  LogClass(QIODevice* device) : stream(new Stream(device)) {}
130  LogClass(QString* string) : stream(new Stream(string)) {}
131  LogClass(LOGLEVEL level, QtMsgType t) : mylevel(level), stream(new Stream(t)) {}
132  LogClass(const LogClass& o) : stream(o.stream) { ++stream->ref; }
134 
136  {
137  stream->space = true;
138  stream->ts << " ";
139  return *this;
140  }
142  {
143  stream->space = false;
144  return *this;
145  }
147  {
148  if (stream->space)
149  stream->ts << " ";
150  return *this;
151  }
152 
154  {
155  stream->ts << "\'" << t << "\'";
156  return maybeSpace();
157  }
159  {
160  stream->ts << (bool(t) ? "true" : "false");
161  return maybeSpace();
162  }
164  {
165  stream->ts << t;
166  return maybeSpace();
167  }
168  LogClass& operator<<(signed short t)
169  {
170  stream->ts << t;
171  return maybeSpace();
172  }
173  LogClass& operator<<(unsigned short t)
174  {
175  stream->ts << t;
176  return maybeSpace();
177  }
178  LogClass& operator<<(signed int t)
179  {
180  stream->ts << t;
181  return maybeSpace();
182  }
183  LogClass& operator<<(unsigned int t)
184  {
185  stream->ts << t;
186  return maybeSpace();
187  }
188  LogClass& operator<<(signed long t)
189  {
190  stream->ts << t;
191  return maybeSpace();
192  }
193  LogClass& operator<<(unsigned long t)
194  {
195  stream->ts << t;
196  return maybeSpace();
197  }
198  LogClass& operator<<(qint64 t)
199  {
200  stream->ts << QString::number(t);
201  return maybeSpace();
202  }
203  LogClass& operator<<(quint64 t)
204  {
205  stream->ts << QString::number(t);
206  return maybeSpace();
207  }
209  {
210  stream->ts << t;
211  return maybeSpace();
212  }
213  LogClass& operator<<(double t)
214  {
215  stream->ts << t;
216  return maybeSpace();
217  }
218  LogClass& operator<<(const char* t)
219  {
220  stream->ts << qPrintable(t);
221  return maybeSpace();
222  }
223  LogClass& operator<<(const QString& t)
224  {
225  stream->ts << t;
226  return maybeSpace();
227  }
228  LogClass& operator<<(const QStringRef& t) { return operator<<(t.toString()); }
229  LogClass& operator<<(const QLatin1String& t)
230  {
231  stream->ts << t.latin1();
232  return maybeSpace();
233  }
234  LogClass& operator<<(const QByteArray& t)
235  {
236  stream->ts << t;
237  return maybeSpace();
238  }
239  LogClass& operator<<(const void* t)
240  {
241  stream->ts << t;
242  return maybeSpace();
243  }
244  LogClass& operator<<(QTextStreamFunction f)
245  {
246  stream->ts << f;
247  return *this;
248  }
249 
250  LogClass& operator<<(QTextStreamManipulator m)
251  {
252  stream->ts << m;
253  return *this;
254  }
255 
256  static bool is_activated;
257 };
258 
259 #ifdef LOGGING_ENABLED
260 void LogV(LOGLEVEL level, const QString& s, va_list ap);
261 LX_BASE_EXPORT LogClass Log(Base::LOGLEVEL level);
262 LX_BASE_EXPORT LogClass Log(Base::LOGLEVEL level, const char* msg, ...);
263 #endif
264 
265 
266 #define LOGCOMMAND_DEBUG(x) Base::ScopedLogger _____scopedLogger(Base::D_DEBUG, x);
267 #define LOGCOMMAND_INFO(x) Base::ScopedLogger _____scopedLogger(Base::D_INFO, x);
268 #define LOGCOMMAND(x) Base::ScopedLogger _____scopedLogger(Base::D_WARN, x);
269 #define LOGCOMMAND_WARN(x) Base::ScopedLogger _____scopedLogger(Base::D_WARN, x);
270 #define cUserDebug(...) \
271  if (Base::Settings::getInstance()->getDebugUser()) \
272  { \
273  cWarn(__VA_ARGS__); \
274  }
275 #define LOGVAR(var) cDebug() << QString("%1 = %2").arg(#var).arg(var);
276 
277 class LX_BASE_EXPORT AssertSingleton
278 {
279 public:
281  {
282  static AssertSingleton instance;
283  // volatile int dummy{};
284  return instance;
285  }
286 
287  void setCallBack(std::function<bool(std::string)> f) { mCallback = f; }
288  bool callCallBack(std::string s)
289  {
290  if (mCallback)
291  return mCallback(s);
292  return false;
293  }
294 
295 private:
296  std::function<bool(std::string)> mCallback;
297  AssertSingleton() = default;
298  AssertSingleton(const AssertSingleton&) = delete;
299  AssertSingleton& operator=(const AssertSingleton&) = delete;
300 };
301 
302 class LX_BASE_EXPORT Logger
303 {
304 public:
305  static Logger& instance();
306  static void log(const char* format, ...);
307  static void log(QString s);
308 
309 
310 private:
311  Logger(QString path) : logFilePath(path) {}
312 
313  QString logFilePath;
314 };
315 
316 class LX_BASE_EXPORT ScopedLog
317 {
318 public:
319  ScopedLog(QString a) : m_msg(a) {}
321  QString m_msg;
322 };
323 
324 #define myLog(a) Logger::instance().writeToLog(a);
325 #define myLogAtFinish(a) ScopedLog(a);
326 
327 
328 
329 } // namespace Base
330 
331 #ifdef LOGGING_ENABLED
332 
333 #define cAssert(condition, message) \
334  do \
335  { \
336  if (!(condition)) \
337  { \
338  std::stringstream ss; \
339  ss << "Assertion: `" #condition << "` --> '" << message << "' failed in \n" << __FILE__ << ":" << __LINE__ << "\n"; \
340  std::cerr << ss.str(); \
341  if (Base::AssertSingleton::getInstance().callCallBack(ss.str())) \
342  exit(1); \
343  } \
344  } while (false)
345 
346 
347 LX_BASE_EXPORT void cDebuggerBreak(const char* message);
348 LX_BASE_EXPORT Base::LogClass cDebug();
349 LX_BASE_EXPORT Base::LogClass cInfo();
350 LX_BASE_EXPORT Base::LogClass cError();
351 LX_BASE_EXPORT Base::LogClass cWarn();
352 
353 LX_BASE_EXPORT Base::LogClass cDebug(const QString s);
354 LX_BASE_EXPORT Base::LogClass cInfo(const QString s);
355 LX_BASE_EXPORT Base::LogClass cError(const QString s);
356 LX_BASE_EXPORT Base::LogClass cWarn(const QString s);
357 
358 LX_BASE_EXPORT Base::LogClass cDebug(const char* msg, ...);
359 LX_BASE_EXPORT Base::LogClass cInfo(const char* msg, ...);
360 LX_BASE_EXPORT Base::LogClass cError(const char* msg, ...);
361 LX_BASE_EXPORT Base::LogClass cWarn(const char* msg, ...);
362 
363 
364 
365 #else
366 
367 LX_CORE_EXPORT Base::NoDebugClass noDebug();
368 LX_CORE_EXPORT void noDebug(const char*, ...);
369 LX_CORE_EXPORT void noDebug(const QString&);
370 
371 #define cAssert(condition, message) \
372  do \
373  { \
374  } while (false)
375 #define cDebug \
376  while (false) \
377  noDebug
378 #define cInfo \
379  while (false) \
380  noDebug
381 #define cError \
382  while (false) \
383  noDebug
384 #define cWarn \
385  while (false) \
386  noDebug
387 
388 
389 #endif
Base::LogClass::operator<<
LogClass & operator<<(QChar t)
Definition: Log.h:153
Base::LogBaseClass::~LogBaseClass
virtual ~LogBaseClass()=default
Base::NoDebugClass::quote
NoDebugClass & quote()
Definition: Log.h:95
Base::ScopedLogger::ScopedLogger
ScopedLogger(LOGLEVEL level, const std::string &s)
Base::LogClass::LogClass
LogClass(const LogClass &o)
Definition: Log.h:132
Base::LogClass::operator<<
LogClass & operator<<(unsigned short t)
Definition: Log.h:173
Base::LogClass::maybeSpace
LogClass & maybeSpace()
Definition: Log.h:146
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(qint64 t)=0
Base::ScopedLogger::getIndent
static int getIndent()
Base::LogClass::operator<<
LogClass & operator<<(const QByteArray &t)
Definition: Log.h:234
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(signed long t)=0
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(QChar t)=0
Base::ScopedLog::m_msg
QString m_msg
Definition: Log.h:321
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(bool t)=0
Base::LogClass::operator<<
LogClass & operator<<(signed int t)
Definition: Log.h:178
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(const char *t)=0
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(signed int t)=0
Base::getLogLevel
LX_BASE_EXPORT LOGLEVEL getLogLevel()
Base::D_OFF
@ D_OFF
Definition: Log.h:13
Base::LastError::getErrorMsg
std::string getErrorMsg()
Base::LogClass::LogClass
LogClass(QString *string)
Definition: Log.h:130
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(char t)=0
Base::LogClass::operator<<
LogClass & operator<<(signed long t)
Definition: Log.h:188
Base::LogClass::operator<<
LogClass & operator<<(float t)
Definition: Log.h:208
cWarn
LX_BASE_EXPORT Base::LogClass cWarn()
Base::LastError::setError
LastError & setError(std::string &where, std::string &msg)
Base::LogClass::operator<<
LogClass & operator<<(const void *t)
Definition: Log.h:239
Base::LastError::getError
std::string getError()
Base::LogClass::operator<<
LogClass & operator<<(char t)
Definition: Log.h:163
Base::ScopedLog::ScopedLog
ScopedLog(QString a)
Definition: Log.h:319
Base::AssertSingleton
Definition: Log.h:278
Base::Log
LX_BASE_EXPORT LogClass Log(Base::LOGLEVEL level)
Base::ScopedLog::~ScopedLog
~ScopedLog()
Definition: Log.h:320
Base::LogClass::operator<<
LogClass & operator<<(QTextStreamManipulator m)
Definition: Log.h:250
cError
LX_BASE_EXPORT Base::LogClass cError()
Base::NoDebugClass
Definition: Log.h:88
cDebug
LX_BASE_EXPORT Base::LogClass cDebug()
Base::NoDebugClass::operator<<
NoDebugClass & operator<<(const T &)
Definition: Log.h:100
Base::ScopedLogger::_piml
ScopedLoggerP * _piml
Definition: Log.h:52
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(const QByteArray &t)=0
Base::LogClass::operator<<
LogClass & operator<<(quint64 t)
Definition: Log.h:203
Base::NoDebugClass::nospace
NoDebugClass & nospace()
Definition: Log.h:93
Base::D_WARN
@ D_WARN
Definition: Log.h:16
Base::AssertSingleton::getInstance
static AssertSingleton & getInstance()
Definition: Log.h:280
Base::ScopedLogger
Definition: Log.h:45
Base::LOGLEVEL
LOGLEVEL
Definition: Log.h:12
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(unsigned long t)=0
Base::Logger::log
static void log(QString s)
Base::LogClass::space
LogClass & space()
Definition: Log.h:135
Base::Logger
Definition: Log.h:303
Base::LogClass::operator<<
LogClass & operator<<(unsigned long t)
Definition: Log.h:193
Base::NoDebugClass::maybeSpace
NoDebugClass & maybeSpace()
Definition: Log.h:94
Base::LogClass::is_activated
static bool is_activated
Definition: Log.h:256
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(const void *t)=0
Base::D_FATAL
@ D_FATAL
Definition: Log.h:14
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(unsigned int t)=0
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(float t)=0
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(double t)=0
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(const QStringRef &t)=0
Base::NoDebugClass::space
NoDebugClass & space()
Definition: Log.h:92
Base::LastError::setError
LastError & setError(const char *where, const char *msg,...)
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(QTextStreamFunction f)=0
Base::LogClass::operator<<
LogClass & operator<<(unsigned int t)
Definition: Log.h:183
Base::LogBaseClass::nospace
virtual LogBaseClass & nospace()=0
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(unsigned short t)=0
Base::setLogLevel
LX_BASE_EXPORT void setLogLevel(LOGLEVEL)
Base::LastError
Definition: Log.h:26
cDebuggerBreak
LX_BASE_EXPORT void cDebuggerBreak(const char *message)
Base::ScopedLogger::~ScopedLogger
~ScopedLogger()
Base::D_ERROR
@ D_ERROR
Definition: Log.h:15
Base::LastError::Instance
static LastError & Instance()
Base::LogClass::operator<<
LogClass & operator<<(QTextStreamFunction f)
Definition: Log.h:244
Base::LogBaseClass::space
virtual LogBaseClass & space()=0
Base::LogClass::LogClass
LogClass(LOGLEVEL level, QtMsgType t)
Definition: Log.h:131
Base::LastError::append
LastError & append(std::string &msg)
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(const QString &t)=0
Base::NoDebugClass::operator<<
NoDebugClass & operator<<(QTextStreamFunction)
Definition: Log.h:90
Base::LogClass::operator<<
LogClass & operator<<(double t)
Definition: Log.h:213
Base::LogClass::operator<<
LogClass & operator<<(const QLatin1String &t)
Definition: Log.h:229
Base::NoDebugClass::operator<<
NoDebugClass & operator<<(QTextStreamManipulator)
Definition: Log.h:91
Base::LogClass::nospace
LogClass & nospace()
Definition: Log.h:141
Base::ScopedLog
Definition: Log.h:317
Base::Logger::instance
static Logger & instance()
Base::D_INFO
@ D_INFO
Definition: Log.h:17
Base::NoDebugClass::maybeQuote
NoDebugClass & maybeQuote(const char='"')
Definition: Log.h:97
Base::LastError::LastError
LastError()=default
cInfo
LX_BASE_EXPORT Base::LogClass cInfo()
Base::AssertSingleton::callCallBack
bool callCallBack(std::string s)
Definition: Log.h:288
Base::Logger::log
static void log(const char *format,...)
Base::AssertSingleton::setCallBack
void setCallBack(std::function< bool(std::string)> f)
Definition: Log.h:287
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(const QLatin1String &t)=0
Base::LogClass::operator<<
LogClass & operator<<(const QString &t)
Definition: Log.h:223
Base::D_ALL
@ D_ALL
Definition: Log.h:19
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(QTextStreamManipulator m)=0
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(quint64 t)=0
Base::NoDebugClass::noquote
NoDebugClass & noquote()
Definition: Log.h:96
Base::LogClass::~LogClass
~LogClass()
Base::D_DEBUG
@ D_DEBUG
Definition: Log.h:18
Base::LogClass::operator<<
LogClass & operator<<(const QStringRef &t)
Definition: Log.h:228
Base::LogV
void LogV(LOGLEVEL level, const QString &s, va_list ap)
Base::LogBaseClass::maybeSpace
virtual LogBaseClass & maybeSpace()=0
Base::LogClass::operator<<
LogClass & operator<<(qint64 t)
Definition: Log.h:198
Base::LogBaseClass
Definition: Log.h:58
Base::LogClass
Definition: Log.h:108
Base::LogClass::operator<<
LogClass & operator<<(bool t)
Definition: Log.h:158
Base::LogClass::operator<<
LogClass & operator<<(signed short t)
Definition: Log.h:168
Base
Definition: AbstractXMLReader.h:5
Base::LogBaseClass::operator<<
virtual LogBaseClass & operator<<(signed short t)=0
Base::LogClass::LogClass
LogClass(QIODevice *device)
Definition: Log.h:129
Base::LogClass::operator<<
LogClass & operator<<(const char *t)
Definition: Log.h:218