Dynalib Utils
DynaLogger.h
Go to the documentation of this file.
1 
12 #ifndef DYNALOGGER_H
13 #define DYNALOGGER_H
14 
15 #include <iostream>
16 #include <fstream>
17 #include <chrono>
18 using namespace std;
19 using namespace std::chrono;
20 
21 #include "String.h"
22 #include "IntWrapper.h"
23 #include "DynaHashMap.h"
24 #include "DynaHashSet.h"
25 #include "FileUtils.h"
26 //#include "concurrent/concurrent_queue.h"
27 
58 class DynaOutputSink;
59 class DynaOutputSinkFile;
60 class DynaLogger;
61 class DynaAppender;
62 
69 
71 
72 static const int MAX_ROLLING_KEEP = 20;
73 static const int MIN_MAX_FILE_SIZE_KB = 50;
74 static const int MAX_LOG_ENTRY_SIZE = 100000;
75 
76 static const uint16_t TRIGGER_DATE_CHANGE = 0x0001U;
77 static const uint16_t TRIGGER_HOUR_CHANGE = 0x0002U;
78 static const uint16_t ROLLING_ARCHIVE = 0x0004U;
79 
80 static const char* sinkTypeName[] {"file", "console", "error"};
81 static const char* logLevelName[] {"NONE", "FATAL", "CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG", "TRACE", "ALL"};
82 
84 
86 MAKE_MAPTYPE_DEF(ESinkType, DynaOutputSink, DynaOutputType);
87 MAKE_MAPTYPE_DEF(String, DynaOutputSink, DynaOutputFile);
88 MAKE_MAPTYPE_DEF(ESinkType, DynaAppender, DynaAppenderType);
89 MAKE_MAPTYPE_DEF(String, DynaAppender, DynaAppenderFile);
90 MAKE_SETTYPE_DEF(DynaOutputSink, DefaultSink);
91 
93  static DynaLogger* logger;
94  static DynaLoggerManager* _instance;
95  DynaLoggerMap* _loggerMap;
96  DynaOutputTypeMap* _outputTypeMap;
97  DynaOutputFileMap* _outputFileMap;
98  DefaultSinkSet* _defSinkSet;
99  LogLevel _minLogLevel;
100  LogLevel _maxLogLevel;
101  String _rootLogDirectory;
102  bool _autoFlushAll;
103  bool _disableColours;
104 
105  friend class DynaOutputSink;
106 
108 
109 public:
110  static DynaLoggerManager* getSingleton();
111  static DynaLogger* getManagerLogger();
112  static void deleteSingleton();
113  static DynaOutputSinkFile* initDefaultSink(const char* fileNamePrefix);
114 
115  virtual ~DynaLoggerManager();
116 
117  void shutdown();
118  String& getRootLogDirectory();
119  bool setRootLogDirectory(const char* directory);
120  DynaLogger* getLogger(const char* name);
121  bool registerLogger(const char* name, DynaLogger* logger);
122  void flushAll();
123  void setAutoFlushAll(bool autoFlushAll);
124  bool isAutoFlushAll();
125  void setDisableColours(bool disableColours);
126  bool isDisableColours();
127 
128  DynaOutputSink* addOutputSink(DynaOutputSink* sink);
129  DynaOutputSink* addOutputSink(SinkType type);
130  DynaOutputSinkFile* addOutputSink(const char* fileNamePrefix);
131  bool enableOutputSink(SinkType type, bool enable);
132  bool enableOutputSink(const char* fileNamePrefix, bool enable);
133  // bool removeOutputSink(SinkType type);
134  // bool removeOutputSink(const char* fileNamePrefix);
135 
136  DynaOutputSink* getOutputSink(SinkType type);
137  DynaOutputSinkFile* getOutputSink(const char* fileNamePrefix);
138 
139  DynaOutputSink* addDefaultSink(SinkType type);
140  DynaOutputSinkFile* addDefaultSink(const char* fileNamePrefix);
141  bool removeDefaultSink(SinkType type);
142  bool removeDefaultSink(const char* fileNamePrefix);
143  DefaultSinkSet* getDefaultSinks();
144  void initAllLoggers();
145 
148  void setLogLevel(LogLevel level, bool resetOverride = false);
149  void setMinLogLevel(LogLevel minLevel, bool resetOverride = false);
150  void setMaxLogLevel(LogLevel maxLevel, bool resetOverride = false);
151  void setLogLevels(LogLevel minLevel, LogLevel maxLevel, bool resetOverride = false);
159  void setLoggerLogLevels(const char* loggerName, LogLevel minLevel, LogLevel maxLevel, bool resetOverride = false);
160  void setOutputLogLevels(SinkType type, LogLevel minLevel, LogLevel maxLevel, bool resetOverride = false);
161  void setOutputLogLevels(const char* filePrefixName, LogLevel minLevel, LogLevel maxLevel, bool resetOverride = false);
162 
169  void updateLoggerLogLevels(const char* name, bool resetOverride = false);
170  void updateAllLogLevels(bool resetOverride = false);
171 };
172 
173 class DynaOutputSink : public IHashable<DynaOutputSink>, public ICopyable<DynaOutputSink> {
174 protected:
181  bool _enabled;
182 
183 protected:
185 // ste::concurrent_queue<String*>* _queue;
186 
187 public:
188  DynaOutputSink();
189  DynaOutputSink(SinkType type);
190  virtual ~DynaOutputSink();
191 
192  DynaOutputSink(const DynaOutputSink& other);
193  DynaOutputSink* copy() override;
194 
195  //-----------------------------------------------------------------
196  // IHashable Implementation
197  //-----------------------------------------------------------------
198  int hashCode() const override;
199  bool operator== (const DynaOutputSink& other) const override;
200 
201  SinkType getType();
202 
203  void setManager(DynaLoggerManager* mgr);
204 
205  void setAnsiColors(ANSIColors colors);
206  void setAutoFlush(bool autoFlush);
207  bool isEnabled();
208  void setEnabled(bool enabled);
209 
210  LogLevel getMinLogLevel();
211  LogLevel getMaxLogLevel();
212  void setLogLevel(LogLevel level);
213  void setMinLogLevel(LogLevel minLevel);
214  void setMaxLogLevel(LogLevel maxLevel);
215  void setLogLevels(LogLevel minLevel, LogLevel maxLevel, bool override = true);
216 
241  String ansiOn(LogLevel level);
242  bool isLevelOverride();
243 
244  virtual bool appendToQueue(LogLevel level, const char* outStr);
245  virtual void flush();
246 };
247 
249 public:
251  DynaOutputSinkConsole(const char* fileNamePrefix);
252  virtual ~DynaOutputSinkConsole();
253 
255  DynaOutputSinkConsole* copy() override;
256 
257  bool appendToQueue(LogLevel level, const char* outStr) override;
258  void flush() override;
259 };
260 
262 
263 public:
265  DynaOutputSinkError(const char* fileNamePrefix);
266  virtual ~DynaOutputSinkError();
267 
269  DynaOutputSinkError* copy() override;
270 
271  bool appendToQueue(LogLevel level, const char* outStr) override;
272  void flush() override;
273 };
274 
276  String _fileNamePrefix;
277  String _fileName;
278  FILE* _logFile;
279  uint16_t _filePolicies;
280  uint64_t _maxFileSize; // bytes
281  int _maxFiles;
282  int _curDayOfYear;
283  int _curHourOfDay;
284 
285 public:
286  DynaOutputSinkFile(const char* fileNamePrefix);
287  virtual ~DynaOutputSinkFile();
288 
290  DynaOutputSinkFile* copy() override;
291 
292  //-----------------------------------------------------------------
293  // IHashable Overrides
294  //-----------------------------------------------------------------
295  int hashCode() const override;
296 
297  String& getFileNamePrefix();
298  String& getFileName();
299  FILE* getFile();
300 
301  void setPolicies(uint16_t policyBits);
302  void clearPolicies(uint16_t policyBits);
303  void setMaxFileSizeKB(uint32_t maxSize);
304  uint64_t getMaxFileSizeKB();
305  void setRollingMaxKeep(int maxKeepFiles);
306  int getRollingMaxKeep();
307 
308  bool open();
309  bool isOpen();
310  void close();
311  tm getCurrentTimeInfo();
312  bool fileNeedsToChange();
313  void shuffleFileNames(String& fileName, int index);
314  void getNextFileName();
315 
316  bool appendToQueue(LogLevel level, const char* outStr) override;
317  void flush() override;
318 };
319 
320 
321 class DynaLogger : public IHashable<DynaLogger>, public ICopyable<DynaLogger> {
322  String _name;
323  DynaAppenderTypeMap* _appenderTypeMap;
324  DynaAppenderFileMap* _appenderFileMap;
325  LogLevel _minLogLevel;
326  LogLevel _maxLogLevel;
327  bool _levelOverride;
328  long _traceCount;
329  long _traceCounter;
330  bool _compactConsoleDebug;
331 
332  DynaLogger();
333 
334  system_clock::time_point _getNow();
335  String _getDateTime(system_clock::time_point t1, const char* format);
336  void _log(LogLevel level, const char* msg, va_list args);
337 
338 public:
339  virtual ~DynaLogger();
340 
341  DynaLogger(const DynaLogger& other);
342  DynaLogger* copy() override;
343 
344  //-----------------------------------------------------------------
345  // IHashable Implementation
346  //-----------------------------------------------------------------
347  int hashCode() const override;
348  bool operator== (const DynaLogger& other) const override;
349 
350  static DynaLogger* getLogger(const char* name, bool addDefAppenders = true);
351 
352  void addDefaultAppenders();
353  void setTraceCount(long count);
354  long getTraceCount();
355  void resetTraceCounter();
356  void setCompactConsoleDebug(bool compactOn);
357 
358  DynaAppender* addAppender(DynaAppender* appender);
359  DynaAppender* addAppender(SinkType type);
360  DynaAppender* addAppender(const char* fileNamePrefix);
361  DynaAppender* getAppender(SinkType type);
362  DynaAppender* getAppender(const char* fileNamePrefix);
363  bool removeAppender(SinkType type);
364  bool removeAppender(const char* fileNamePrefix);
365 
366  LogLevel getMinLogLevel();
367  LogLevel getMaxLogLevel();
368  void setLogLevel(LogLevel level);
369  void setMinLogLevel(LogLevel minLevel);
370  void setMaxLogLevel(LogLevel maxLevel);
371  void setLogLevels(LogLevel minLevel, LogLevel maxLevel, bool override = true);
372  void setAppenderLogLevels(SinkType type, LogLevel minLevel, LogLevel maxLevel);
373  void setAppenderLogLevels(const char* filePrefixName, LogLevel minLevel, LogLevel maxLevel);
374 
375  bool isLevelOverride();
376 
377  void updateAppenderLogLevels(SinkType type, bool resetOverride = false);
378  void updateAppenderLogLevels(const char* fileNamePrefix, bool resetOverride = false);
379  void updateAllAppenderLogLevels(bool resetOverride = false);
380 
381  void log(LogLevel level, const char* msg, ...);
382  void fatal(const char* msg, ...);
383  void critical(const char* msg, ...);
384  void error(const char* msg, ...);
385  void warning(const char* msg, ...);
386  void info(const char* msg, ...);
387  void debug(const char* msg, ...);
388  void trace(const char* msg, ...);
389 };
390 
391 class DynaAppender : public IHashable<DynaAppender>, public ICopyable<DynaAppender> {
392 protected:
398 
399  DynaAppender(SinkType type);
400 
401 public:
402  static DynaAppender* getTypedAppender(SinkType sinkType);
403  static DynaAppender* getConsoleAppender();
404  static DynaAppender* getErrorAppender();
405  static DynaAppender* getFileAppender(const char* fileNamePrefix);
406  virtual ~DynaAppender();
407 
408  DynaAppender(const DynaAppender& other);
409  DynaAppender* copy() override;
410 
411  //-----------------------------------------------------------------
412  // IHashable Implementation
413  //-----------------------------------------------------------------
414  int hashCode() const override;
415  bool operator== (const DynaAppender& other) const override;
416 
417  LogLevel getMinLogLevel();
418  LogLevel getMaxLogLevel();
419  void setLogLevel(LogLevel level);
420  void setMinLogLevel(LogLevel minLevel);
421  void setMaxLogLevel(LogLevel maxLevel);
422  void setLogLevels(LogLevel minLevel, LogLevel maxLevel, bool override = true);
423 
424  bool isLevelOverride();
425 
426  DynaOutputSink* getOutputSink();
427  void setOutputSink(DynaOutputSink* sink);
428  SinkType getType();
429 
430  bool append(LogLevel level, const char* outStr);
431 };
432 #endif
Definition: DynaLogger.h:68
bool _levelOverride
Definition: DynaLogger.h:397
DynaLoggerManager * _mgr
Definition: DynaLogger.h:184
CONSTCD11 bool operator==(const day &x, const day &y) NOEXCEPT
Definition: date.h:1274
Definition: DynaLogger.h:92
Definition: IHashable.h:10
IntWrapper< SinkType > ESinkType
Definition: DynaLogger.h:83
bool _enabled
Definition: DynaLogger.h:181
Definition: DynaLogger.h:173
LogLevel getMaxLogLevel()
Definition: DynaLogger.cpp:425
LogLevel _minLogLevel
Definition: DynaLogger.h:395
SinkType
Definition: DynaLogger.h:68
LogLevel _minLogLevel
Definition: DynaLogger.h:176
void setLogLevel(LogLevel level)
Definition: DynaLogger.cpp:429
DynaLogger * logger
Definition: Manager.cpp:23
std::chrono::time_point< Clock, Duration > time_point
Definition: tz.h:2265
Definition: DynaLogger.h:261
Definition: DynaLogger.h:67
void setLogLevels(LogLevel minLevel, LogLevel maxLevel, bool override=true)
Definition: DynaLogger.cpp:447
ANSIColors
Definition: DynaLogger.h:70
Definition: DynaLogger.h:67
Definition: DynaLogger.h:67
Definition: DynaLogger.h:391
Definition: DynaLogger.h:68
void setMinLogLevel(LogLevel minLevel)
Definition: DynaLogger.cpp:435
auto format(const std::locale &loc, const CharT *fmt, const Streamable &tp) -> decltype(to_stream(std::declval< std::basic_ostream< CharT > &>(), fmt, tp), std::basic_string< CharT >
Definition: date.h:5663
Definition: String.h:60
SinkType _type
Definition: DynaLogger.h:175
void t1(Test &test, int &counter)
Definition: TestSynch.cpp:38
bool _levelOverride
Definition: DynaLogger.h:178
LogLevel getMinLogLevel()
Definition: DynaLogger.cpp:421
DynaOutputSink * _output
Definition: DynaLogger.h:394
Definition: IntWrapper.h:13
Definition: DynaLogger.h:67
Definition: DynaLogger.h:67
Definition: DynaLogger.h:321
LogLevel _maxLogLevel
Definition: DynaLogger.h:396
MAKE_MAPTYPE_DEF(String, DynaLogger, DynaLogger)
SinkType _type
Definition: DynaLogger.h:393
ANSIColors _colors
Definition: DynaLogger.h:179
LogLevel _maxLogLevel
Definition: DynaLogger.h:177
Definition: DynaLogger.h:67
bool _autoFlush
Definition: DynaLogger.h:180
Definition: DynaLogger.h:70
LogLevel
From coarsest to finest setting. FATAL produces the least output, while TRACE produces the most...
Definition: DynaLogger.h:67
Definition: DynaLogger.h:67
Definition: DynaLogger.h:67
Definition: DynaLogger.h:70
Definition: DynaLogger.h:70
Definition: DynaLogger.h:68
int hashCode(bool key)
Definition: HashCoder.cpp:27
Definition: ICopyable.h:8
void setMaxLogLevel(LogLevel maxLevel)
Definition: DynaLogger.cpp:441
MAKE_SETTYPE_DEF(DynaOutputSink, DefaultSink)
Definition: DynaLogger.h:275
Definition: DynaLogger.h:248