EpcTools
An event based multi-threaded C++ development framework.
elogger.h
Go to the documentation of this file.
1 /*
2 * Copyright (c) 2009-2019 Brian Waters
3 * Copyright (c) 2019 Sprint
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 
18 #ifndef __elogger_h_included
19 #define __elogger_h_included
20 
23 
24 #include <vector>
25 #include <map>
26 #include <unordered_map>
27 
29 #ifdef minor
30 #undef minor
31 #endif
32 
33 #ifdef major
34 #undef major
35 #endif
36 
37 #ifdef SPDLOG_LEVEL_NAMES
38 #undef SPDLOG_LEVEL_NAMES
39 #endif
40 
41 //#define SPDLOG_LEVEL_NAMES { "trace", "debug", "info", "warning", "error", "critical", "off" };
42 #define SPDLOG_LEVEL_NAMES { "debug", "info", "startup", "minor", "major", "critical", "off" };
43 
44 #define SPDLOG_ENABLE_SYSLOG
45 
47 #include "spdlog/spdlog.h"
48 #include "spdlog/async.h"
49 
50 #include "ebase.h"
51 #include "eerror.h"
52 #include "egetopt.h"
53 #include "estring.h"
54 #include "eutil.h"
55 
58 
60 DECLARE_ERROR_ADVANCED2(ELoggerError_LogNotFound);
61 DECLARE_ERROR_ADVANCED2(ELoggerError_LogExists);
62 DECLARE_ERROR_ADVANCED2(ELoggerError_SinkSetNotFound);
63 DECLARE_ERROR_ADVANCED2(ELoggerError_SinkSetExists);
64 
65 DECLARE_ERROR(ELoggerError_SinkSetLogIdNotSpecified);
66 DECLARE_ERROR(ELoggerError_SinkSetSinkIdNotSpecified);
67 DECLARE_ERROR(ELoggerError_SinkSetCategoryNotSpecified);
68 DECLARE_ERROR(ELoggerError_SinkSetSinkTypeNotSpecified);
69 
70 DECLARE_ERROR_ADVANCED4(ELoggerError_SinkSetUnrecognizedSinkType);
72 
73 class ELoggerSinkSet;
74 
76 class ELogger
77 {
78  friend class ELoggerInit;
79 
80 public:
82  enum LogLevel
83  {
85  eDebug = spdlog::level::trace,
87  eInfo = spdlog::level::debug,
89  eStartup = spdlog::level::info,
91  eMinor = spdlog::level::warn,
93  eMajor = spdlog::level::err,
95  eCritical = spdlog::level::critical,
97  eOff = spdlog::level::off
98  };
99 
104  ELogger(Int logid, cpStr category, Int sinkid);
106  ~ELogger() {}
107 
110  static EString &applicationName() { return m_appname; }
113  static EString &applicationName(cpStr app) { return m_appname = app; }
114 
122  static ELogger &createLog(Int logid, cpStr category, Int sinkid);
127  static ELoggerSinkSet &createSinkSet(Int sinkid);
128 
133  static ELogger &log(Int logid)
134  {
135  auto srch = m_logs.find(logid);
136  if (srch == m_logs.end())
137  throw ELoggerError_LogNotFound(logid);
138  return *srch->second;
139  }
140 
145  static ELoggerSinkSet &sinkSet(Int sinkid)
146  {
147  if (m_sinksets.find(sinkid) == m_sinksets.end())
148  throw ELoggerError_SinkSetNotFound(sinkid);
149 
150  return *m_sinksets[sinkid];
151  }
152 
156  template<typename... Args>
157  Void debug( cpStr format, const Args &... args) { m_log->trace(format, args...); }
161  template<typename... Args>
162  Void info( cpStr format, const Args &... args) { m_log->debug(format, args...); }
166  template<typename... Args>
167  Void startup( cpStr format, const Args &... args) { m_log->info(format, args...); }
171  template<typename... Args>
172  Void minor( cpStr format, const Args &... args) { m_log->warn(format, args...); }
176  template<typename... Args>
177  Void major( cpStr format, const Args &... args) { m_log->error(format, args...); }
181  template<typename... Args>
182  Void critical( cpStr format, const Args &... args) { m_log->critical(format, args...); }
183 
185  Void flush() { m_log->flush(); }
186 
189  Void setLogLevel( LogLevel lvl ) { m_log->set_level((spdlog::level::level_enum)lvl); }
192  Void setLogLevel( cpStr lvl_name ) { setLogLevel((LogLevel)spdlog::level::from_str(lvl_name)); }
195  LogLevel getLogLevel() { return (LogLevel)m_log->level(); }
198  EString getLogLevelName() const;
199 
202  const std::string &get_name() { return m_log->name(); }
203 
206  Int getSinkId() const { return m_sinkid; }
207 
210  Int getLogId() const { return m_logid; }
211 
214  spdlog::level::level_enum get_level() { return m_log->level(); }
217  Void set_level(spdlog::level::level_enum lvl) { m_log->set_level(lvl); }
218 
221  static const std::map<std::string,std::shared_ptr<ELogger>> &get_loggers() { return m_logs_by_name; }
222 
225  static const std::unordered_map<Int,std::shared_ptr<ELoggerSinkSet>> &get_sinksets() { return m_sinksets; }
226 
227 protected:
233  static Void init(EGetOpt &opt);
235  static Void uninit();
236 
237 private:
238  static EString m_appname;
239  static std::unordered_map<Int,std::shared_ptr<ELoggerSinkSet>> m_sinksets;
240  static std::unordered_map<Int,std::shared_ptr<ELogger>> m_logs;
241  static std::map<std::string,std::shared_ptr<ELogger>> m_logs_by_name;
242 
243  Int m_logid;
244  Int m_sinkid;
245  EString m_category;
246  std::shared_ptr<spdlog::async_logger> m_log;
247 };
248 
251 
254 {
255 public:
257  enum SinkType
258  {
272  eRingBuffer
273  };
274 
276  virtual ~ELoggerSink() {}
277 
280  SinkType getSinkType() { return m_sinktype; }
283  ELogger::LogLevel getLogLevel() { return (ELogger::LogLevel)m_sinkptr->level(); }
286  EString getLogLevelName() const;
289  EString &getPattern() { return m_pattern; }
290 
295  { m_sinkptr->set_level( (spdlog::level::level_enum)loglevel ); m_loglevel = loglevel; return getLogLevel(); }
298  ELogger::LogLevel setLogLevel( cpStr lvl_name )
299  { return setLogLevel((ELogger::LogLevel)spdlog::level::from_str(lvl_name)); }
303  EString &setPattern( cpStr pattern )
304  { m_pattern = pattern; m_sinkptr->set_pattern( m_pattern ); return getPattern(); }
305 
308  spdlog::sink_ptr getSinkPtr() { return m_sinkptr; }
309 
312  static EString &getDefaultPattern() { return m_defaultpattern; }
313 
314 protected:
319  ELoggerSink( SinkType sinktype, ELogger::LogLevel loglevel, cpStr pattern )
320  : m_sinktype( sinktype ),
321  m_loglevel( loglevel ),
322  m_pattern( pattern )
323  {
324  }
325 
329  spdlog::sink_ptr setSinkPtr( spdlog::sink_ptr &sinkptr ) { return m_sinkptr = sinkptr; }
330 
331 private:
332  ELoggerSink();
333  static EString m_defaultpattern;
334 
335  SinkType m_sinktype;
336  ELogger::LogLevel m_loglevel;
337  EString m_pattern;
338  spdlog::sink_ptr m_sinkptr;
339 };
340 
343 {
344 public:
348  ELoggerSinkSyslog( ELogger::LogLevel loglevel, cpStr pattern );
350  virtual ~ELoggerSinkSyslog() {}
351 private:
353 };
354 
357 {
358 public:
362  ELoggerSinkStdout( ELogger::LogLevel loglevel, cpStr pattern );
364  virtual ~ELoggerSinkStdout() {}
365 private:
367 };
368 
371 {
372 public:
376  ELoggerSinkStderr( ELogger::LogLevel loglevel, cpStr pattern );
378  virtual ~ELoggerSinkStderr() {}
379 private:
381 };
382 
385 {
386 public:
392  ELoggerSinkBasicFile( ELogger::LogLevel loglevel, cpStr pattern,
393  cpStr filename, Bool truncate );
396 
399  EString &getFilename() { return m_filename; }
402  Bool getTruncate() { return m_truncate; }
403 
404 private:
405  EString m_filename;
406  Bool m_truncate;
407 };
408 
411 {
412 public:
420  ELoggerSinkRotatingFile( ELogger::LogLevel loglevel, cpStr pattern,
421  cpStr filename, size_t maxsizemb, size_t maxfiles, Bool rotateonopen );
424 
427  EString &getFilename() { return m_filename; }
430  size_t getMaxSizeMB() { return m_maxsizemb; }
433  size_t getMaxFiles() { return m_maxfiles; }
436  Bool getRotateOnOpen() { return m_rotateonopen; }
437 
438 private:
439  EString m_filename;
440  size_t m_maxsizemb;
441  size_t m_maxfiles;
442  Bool m_rotateonopen;
443 };
444 
447 {
448 public:
456  ELoggerSinkDailyFile( ELogger::LogLevel loglevel, cpStr pattern,
457  cpStr filename, Bool truncate, Int rolloverhour, Int rolloverminute );
460 
463  EString &getFilename() { return m_filename; }
466  Bool getTruncate() { return m_truncate; }
469  Int getRolloverHour() { return m_rolloverhour; }
472  Int getRolloverMinute() { return m_rolloverminute; }
473 
474 private:
475  EString m_filename;
476  Bool m_truncate;
477  Int m_rolloverhour;
478  Int m_rolloverminute;
479 };
480 
483 {
484 public:
489  ELoggerSinkRingBuffer( ELogger::LogLevel loglevel, cpStr pattern, size_t nitems );
492 
495  size_t getNumberItems() { return m_nitems; }
496 
500  std::vector<std::string> lastFormatted(size_t limit = 0);
501 
502 private:
503  size_t m_nitems;
504 };
505 
508 
511 {
512  friend ELogger;
513 public:
516  ELoggerSinkSet(Int id=-1) : m_id(id) {}
519 
522  Void addSink(std::shared_ptr<ELoggerSink> &sink)
523  {
524  m_sinks.push_back( sink );
525  m_spdlog_sinks.push_back( sink->getSinkPtr() );
526  }
527 
530  std::vector<std::shared_ptr<ELoggerSink>> &getVector() { return m_sinks; }
533  std::vector<spdlog::sink_ptr> &getSpdlogVector() { return m_spdlog_sinks; }
534 
538  Int setId(Int id) { return m_id = id; }
541  Int getId() { return m_id; }
542 
543 private:
544  Int m_id;
545  std::vector<std::shared_ptr<ELoggerSink>> m_sinks;
546  std::vector<spdlog::sink_ptr> m_spdlog_sinks;
547 };
548 
549 #endif // #define __elogger_h_included
virtual ~ELoggerSinkStderr()
Class destructor.
Definition: elogger.h:378
Void major(cpStr format, const Args &...args)
Writes a major message to this logger.
Definition: elogger.h:177
a simple file
Definition: elogger.h:266
static ELoggerSinkSet & createSinkSet(Int sinkid)
Manually creates a sink set.
Definition: elogger.cpp:289
Void addSink(std::shared_ptr< ELoggerSink > &sink)
Adds a sink to the sink set.
Definition: elogger.h:522
Encapsulates and extends a std::string object.
A syslog sink.
Definition: elogger.h:342
static ELogger & log(Int logid)
Retrieves the requested ELogger object.
Definition: elogger.h:133
Critical.
Definition: elogger.h:95
EString getLogLevelName() const
Retrieve the name of the currently assigned log level.
Definition: elogger.cpp:301
#define DECLARE_ERROR_ADVANCED4(__e__)
Declares exception class derived from EError with an const char* as a constructor parameter and devel...
Definition: eerror.h:85
size_t getNumberItems()
Retrieves the number of items stored in the buffer.
Definition: elogger.h:495
spdlog::sink_ptr setSinkPtr(spdlog::sink_ptr &sinkptr)
Assigns the spdlog pointer value.
Definition: elogger.h:329
Int getSinkId() const
Retrieve the sink id of the logger.
Definition: elogger.h:206
Macros for various standard C library functions and standard includes.
Definition: elogger.cpp:69
A daily file sink.
Definition: elogger.h:446
a rotating set of files
Definition: elogger.h:268
ELogger::LogLevel getLogLevel()
Retrieves the log level for this sink.
Definition: elogger.h:283
static EString & applicationName(cpStr app)
Assigns the application name.
Definition: elogger.h:113
Defines a group of output sinks that can be assigned to a logger.
Definition: elogger.h:510
static ELogger & createLog(Int logid, cpStr category, Int sinkid)
Manually creates a logger.
Definition: elogger.cpp:273
ELoggerSinkSet(Int id=-1)
Class constructor.
Definition: elogger.h:516
size_t getMaxSizeMB()
Retrieves the maximum log file size.
Definition: elogger.h:430
Major.
Definition: elogger.h:93
Void flush()
Flushes any unwritten log messages to the underlying sinks.
Definition: elogger.h:185
~ELoggerSinkSet()
Class destructor.
Definition: elogger.h:518
Manages configuration parameters from a file and the command line.
standard error
Definition: elogger.h:264
Bool getTruncate()
Retrieves the truncate flag.
Definition: elogger.h:466
Void debug(cpStr format, const Args &...args)
Writes a debug message to this logger.
Definition: elogger.h:157
static EString & getDefaultPattern()
Retrieves the default log message formatting pattern.
Definition: elogger.h:312
ELoggerSink(SinkType sinktype, ELogger::LogLevel loglevel, cpStr pattern)
The base class constructor.
Definition: elogger.h:319
A ring buffer sink.
Definition: elogger.h:482
ELogger::LogLevel setLogLevel(ELogger::LogLevel loglevel)
Assigns the sink log level.
Definition: elogger.h:294
~ELogger()
Class destructor.
Definition: elogger.h:106
virtual ~ELoggerSink()
Class destructor.
Definition: elogger.h:276
spdlog::sink_ptr getSinkPtr()
Retrieves the underlying spdlog sink pointer.
Definition: elogger.h:308
Void startup(cpStr format, const Args &...args)
Writes a startup message to this logger.
Definition: elogger.h:167
std::vector< std::shared_ptr< ELoggerSink > > & getVector()
Retrieves the vector of sinks.
Definition: elogger.h:530
standard output
Definition: elogger.h:262
Definition: egetopt.h:31
size_t getMaxFiles()
Retrieves the maximum number of files in the rotation.
Definition: elogger.h:433
A standard output sink.
Definition: elogger.h:356
static const std::map< std::string, std::shared_ptr< ELogger > > & get_loggers()
Retrieve the defined loggers.
Definition: elogger.h:221
a file that rolls over each day at a specified time
Definition: elogger.h:270
Void setLogLevel(LogLevel lvl)
Assign a log level for this logger. Any log messages lower than the specified log level will not be w...
Definition: elogger.h:189
virtual ~ELoggerSinkBasicFile()
Class destructor.
Definition: elogger.h:395
spdlog::level::level_enum get_level()
Retrieve the current log level from the underlying spdlog object.
Definition: elogger.h:214
virtual ~ELoggerSinkRingBuffer()
Class destructor.
Definition: elogger.h:491
const std::string & get_name()
Retrieve the name (category) of the logger.
Definition: elogger.h:202
static ELoggerSinkSet & sinkSet(Int sinkid)
Retrieves the requested sink set object.
Definition: elogger.h:145
Int setId(Int id)
Assigns the sink set ID.
Definition: elogger.h:538
virtual ~ELoggerSinkRotatingFile()
Class destructor.
Definition: elogger.h:423
Represents a logger output sink.
Definition: elogger.h:253
Bool getRotateOnOpen()
Retrieves the rotate on open setting.
Definition: elogger.h:436
ELogger::LogLevel setLogLevel(cpStr lvl_name)
Assign a log level for this sink from a log level name.
Definition: elogger.h:298
syslog
Definition: elogger.h:260
Defines base class for exceptions and declaration helper macros.
Int getLogId() const
Retrieve the log id of the logger.
Definition: elogger.h:210
EString & getFilename()
Retrieves the log file name.
Definition: elogger.h:463
LogLevel getLogLevel()
Retrieve the currently assigned log level.
Definition: elogger.h:195
Void set_level(spdlog::level::level_enum lvl)
Sets the current log level of the underlying spdlog object.
Definition: elogger.h:217
Startup.
Definition: elogger.h:89
A rotating file sink.
Definition: elogger.h:410
Debug.
Definition: elogger.h:85
static Void init(EGetOpt &opt)
Initilizes the logs from the configuration file.
Definition: elogger.cpp:112
virtual ~ELoggerSinkSyslog()
Class destructor.
Definition: elogger.h:350
std::vector< spdlog::sink_ptr > & getSpdlogVector()
Retrieves the spdlog vector of sinks.
Definition: elogger.h:533
Disables logging.
Definition: elogger.h:97
EString & getFilename()
Retrieves the log file name.
Definition: elogger.h:427
Int getRolloverHour()
Retrieves the hour during the day when the rollover will occur.
Definition: elogger.h:469
static Void uninit()
Shuts down the logging system.
Definition: elogger.cpp:268
A standard error sink.
Definition: elogger.h:370
Minor.
Definition: elogger.h:91
Defines various utility functions.
Defines a logger.
Definition: elogger.h:76
virtual ~ELoggerSinkDailyFile()
Class destructor.
Definition: elogger.h:459
#define DECLARE_ERROR(__e__)
Declares exception class derived from EError with no constructor parameters.
Definition: eerror.h:53
EString & setPattern(cpStr pattern)
Assigns the log message formatting pattern.
Definition: elogger.h:303
Informational.
Definition: elogger.h:87
Int getId()
Retrieves teh sink set ID.
Definition: elogger.h:541
ELogger(Int logid, cpStr category, Int sinkid)
Class constructor.
Definition: elogger.cpp:99
Void setLogLevel(cpStr lvl_name)
Assign a log level for this logger from a log level name. Any log messages lower than the specified l...
Definition: elogger.h:192
EString & getPattern()
Retrieves the log message formatting pattern.
Definition: elogger.h:289
Void critical(cpStr format, const Args &...args)
Writes a critical message to this logger.
Definition: elogger.h:182
#define DECLARE_ERROR_ADVANCED2(__e__)
Declares exception class derived from EError with an Int as a constructor parameter and developer def...
Definition: eerror.h:69
virtual ~ELoggerSinkStdout()
Class destructor.
Definition: elogger.h:364
Bool getTruncate()
Retrieves the truncate flag.
Definition: elogger.h:402
LogLevel
Defines the various log levels.
Definition: elogger.h:82
EString & getFilename()
Retrieves the log file name.
Definition: elogger.h:399
SinkType
Defines the type of output sinks.
Definition: elogger.h:257
String class.
Definition: estring.h:31
SinkType getSinkType()
Retrieves the sink type.
Definition: elogger.h:280
static const std::unordered_map< Int, std::shared_ptr< ELoggerSinkSet > > & get_sinksets()
Retrieve the defined sink sets.
Definition: elogger.h:225
Void info(cpStr format, const Args &...args)
Writes a info message to this logger.
Definition: elogger.h:162
static EString & applicationName()
Retrieves the application name.
Definition: elogger.h:110
Void minor(cpStr format, const Args &...args)
Writes a minor message to this logger.
Definition: elogger.h:172
Int getRolloverMinute()
Retrieves the minute within the hour when the rollover will occur.
Definition: elogger.h:472
A basic file sink.
Definition: elogger.h:384