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_ADVANCED3(ELoggerError_SinkSetCreatePath);
71 DECLARE_ERROR_ADVANCED4(ELoggerError_SinkSetNotDirectory);
72 DECLARE_ERROR_ADVANCED4(ELoggerError_SinkSetUnrecognizedSinkType);
74 
75 class ELoggerSinkSet;
76 
78 class ELogger
79 {
80  friend class ELoggerInit;
81 
82 public:
84  enum LogLevel
85  {
87  eDebug = spdlog::level::trace,
89  eInfo = spdlog::level::debug,
91  eStartup = spdlog::level::info,
93  eMinor = spdlog::level::warn,
95  eMajor = spdlog::level::err,
97  eCritical = spdlog::level::critical,
99  eOff = spdlog::level::off
100  };
101 
106  ELogger(Int logid, cpStr category, Int sinkid);
108  ~ELogger() {}
109 
112  static EString &applicationName() { return m_appname; }
115  static EString &applicationName(cpStr app) { return m_appname = app; }
116 
124  static ELogger &createLog(Int logid, cpStr category, Int sinkid);
129  static ELoggerSinkSet &createSinkSet(Int sinkid);
130 
135  static ELogger &log(Int logid)
136  {
137  auto srch = m_logs.find(logid);
138  if (srch == m_logs.end())
139  throw ELoggerError_LogNotFound(logid);
140  return *srch->second;
141  }
142 
147  static ELoggerSinkSet &sinkSet(Int sinkid)
148  {
149  if (m_sinksets.find(sinkid) == m_sinksets.end())
150  throw ELoggerError_SinkSetNotFound(sinkid);
151 
152  return *m_sinksets[sinkid];
153  }
154 
158  template<typename... Args>
159  Void debug( cpStr format, const Args &... args) { m_log->trace(format, args...); }
163  template<typename... Args>
164  Void info( cpStr format, const Args &... args) { m_log->debug(format, args...); }
168  template<typename... Args>
169  Void startup( cpStr format, const Args &... args) { m_log->info(format, args...); }
173  template<typename... Args>
174  Void minor( cpStr format, const Args &... args) { m_log->warn(format, args...); }
178  template<typename... Args>
179  Void major( cpStr format, const Args &... args) { m_log->error(format, args...); }
183  template<typename... Args>
184  Void critical( cpStr format, const Args &... args) { m_log->critical(format, args...); }
185 
187  Void flush() { m_log->flush(); }
188 
191  Void setLogLevel( LogLevel lvl ) { m_log->set_level((spdlog::level::level_enum)lvl); }
194  LogLevel getLogLevel() { return (LogLevel)m_log->level(); }
195 
198  const std::string & get_name() { return m_log->name(); }
199 
202  spdlog::level::level_enum get_level() { return m_log->level(); }
205  Void set_level(spdlog::level::level_enum lvl) { m_log->set_level(lvl); }
206 
209  const std::map<std::string,std::shared_ptr<ELogger>> get_loggers() { return m_logs_by_name; }
210 
211 protected:
217  static Void init(EGetOpt &opt);
219  static Void uninit();
220 
221 private:
222  static EString m_appname;
223  static std::unordered_map<Int,std::shared_ptr<ELoggerSinkSet>> m_sinksets;
224  static std::unordered_map<Int,std::shared_ptr<ELogger>> m_logs;
225  static std::map<std::string,std::shared_ptr<ELogger>> m_logs_by_name;
226 
227  static Void verifyPath(cpStr filename);
228 
229  Int m_logid;
230  Int m_sinkid;
231  EString m_category;
232  std::shared_ptr<spdlog::async_logger> m_log;
233 };
234 
237 
240 {
241 public:
243  enum SinkType
244  {
257  };
258 
260  virtual ~ELoggerSink() {}
261 
264  SinkType getSinkType() { return m_sinktype; }
267  ELogger::LogLevel getLogLevel() { return (ELogger::LogLevel)m_sinkptr->level(); }
270  EString &getPattern() { return m_pattern; }
271 
276  { m_sinkptr->set_level( (spdlog::level::level_enum)loglevel ); m_loglevel = loglevel; return getLogLevel(); }
280  EString &setPattern( cpStr pattern )
281  { m_pattern = pattern; m_sinkptr->set_pattern( m_pattern ); return getPattern(); }
282 
285  spdlog::sink_ptr getSinkPtr() { return m_sinkptr; }
286 
289  static EString &getDefaultPattern() { return m_defaultpattern; }
290 
291 protected:
296  ELoggerSink( SinkType sinktype, ELogger::LogLevel loglevel, cpStr pattern )
297  : m_sinktype( sinktype ),
298  m_loglevel( loglevel ),
299  m_pattern( pattern )
300  {
301  }
302 
306  spdlog::sink_ptr setSinkPtr( spdlog::sink_ptr &sinkptr ) { return m_sinkptr = sinkptr; }
307 
308 private:
309  ELoggerSink();
310  static EString m_defaultpattern;
311 
312  SinkType m_sinktype;
313  ELogger::LogLevel m_loglevel;
314  EString m_pattern;
315  spdlog::sink_ptr m_sinkptr;
316 };
317 
320 {
321 public:
325  ELoggerSinkSyslog( ELogger::LogLevel loglevel, cpStr pattern );
327  virtual ~ELoggerSinkSyslog() {}
328 private:
330 };
331 
334 {
335 public:
339  ELoggerSinkStdout( ELogger::LogLevel loglevel, cpStr pattern );
341  virtual ~ELoggerSinkStdout() {}
342 private:
344 };
345 
348 {
349 public:
353  ELoggerSinkStderr( ELogger::LogLevel loglevel, cpStr pattern );
355  virtual ~ELoggerSinkStderr() {}
356 private:
358 };
359 
362 {
363 public:
369  ELoggerSinkBasicFile( ELogger::LogLevel loglevel, cpStr pattern,
370  cpStr filename, Bool truncate );
373 
376  EString &getFilename() { return m_filename; }
379  Bool getTruncate() { return m_truncate; }
380 
381 private:
382  EString m_filename;
383  Bool m_truncate;
384 };
385 
388 {
389 public:
397  ELoggerSinkRotatingFile( ELogger::LogLevel loglevel, cpStr pattern,
398  cpStr filename, size_t maxsizemb, size_t maxfiles, Bool rotateonopen );
401 
404  EString &getFilename() { return m_filename; }
407  size_t getMaxSizeMB() { return m_maxsizemb; }
410  size_t getMaxFiles() { return m_maxfiles; }
413  Bool getRotateOnOpen() { return m_rotateonopen; }
414 
415 private:
416  EString m_filename;
417  size_t m_maxsizemb;
418  size_t m_maxfiles;
419  Bool m_rotateonopen;
420 };
421 
424 {
425 public:
433  ELoggerSinkDailyFile( ELogger::LogLevel loglevel, cpStr pattern,
434  cpStr filename, Bool truncate, Int rolloverhour, Int rolloverminute );
437 
440  EString &getFilename() { return m_filename; }
443  Bool getTruncate() { return m_truncate; }
446  Int getRolloverHour() { return m_rolloverhour; }
449  Int getRolloverMinute() { return m_rolloverminute; }
450 
451 private:
452  EString m_filename;
453  Bool m_truncate;
454  Int m_rolloverhour;
455  Int m_rolloverminute;
456 };
457 
460 
463 {
464  friend ELogger;
465 public:
468  ELoggerSinkSet(Int id=-1) : m_id(id) {}
471 
474  Void addSink(std::shared_ptr<ELoggerSink> &sink)
475  {
476  m_sinks.push_back( sink );
477  m_spdlog_sinks.push_back( sink->getSinkPtr() );
478  }
479 
482  std::vector<std::shared_ptr<ELoggerSink>> &getVector() { return m_sinks; }
485  std::vector<spdlog::sink_ptr> &getSpdlogVector() { return m_spdlog_sinks; }
486 
490  Int setId(Int id) { return m_id = id; }
493  Int getId() { return m_id; }
494 
495 private:
496  Int m_id;
497  std::vector<std::shared_ptr<ELoggerSink>> m_sinks;
498  std::vector<spdlog::sink_ptr> m_spdlog_sinks;
499 };
500 
501 #endif // #define __elogger_h_included
ELoggerSink::getPattern
EString & getPattern()
Retrieves the log message formatting pattern.
Definition: elogger.h:270
ELogger::get_loggers
const std::map< std::string, std::shared_ptr< ELogger > > get_loggers()
Retrieve the defined loggers.
Definition: elogger.h:209
ELoggerSinkDailyFile::~ELoggerSinkDailyFile
virtual ~ELoggerSinkDailyFile()
Class destructor.
Definition: elogger.h:436
DECLARE_ERROR
#define DECLARE_ERROR(__e__)
Declares exception class derived from EError with no constructor parameters.
Definition: eerror.h:53
ELoggerSinkSet::getId
Int getId()
Retrieves teh sink set ID.
Definition: elogger.h:493
ELoggerSink::getDefaultPattern
static EString & getDefaultPattern()
Retrieves the default log message formatting pattern.
Definition: elogger.h:289
ELogger::eDebug
Debug.
Definition: elogger.h:87
ELogger::get_name
const std::string & get_name()
Retrieve the name (category) of the logger.
Definition: elogger.h:198
eerror.h
Defines base class for exceptions and declaration helper macros.
ELoggerSinkRotatingFile::getMaxFiles
size_t getMaxFiles()
Retrieves the maximum number of files in the rotation.
Definition: elogger.h:410
ELogger::init
static Void init(EGetOpt &opt)
Initilizes the logs from the configuration file.
Definition: elogger.cpp:123
ELoggerSinkStdout::~ELoggerSinkStdout
virtual ~ELoggerSinkStdout()
Class destructor.
Definition: elogger.h:341
ELoggerSinkSet::setId
Int setId(Int id)
Assigns the sink set ID.
Definition: elogger.h:490
ELogger::eStartup
Startup.
Definition: elogger.h:91
ELoggerSink::ELoggerSink
ELoggerSink(SinkType sinktype, ELogger::LogLevel loglevel, cpStr pattern)
The base class constructor.
Definition: elogger.h:296
ELoggerSink::getSinkPtr
spdlog::sink_ptr getSinkPtr()
Retrieves the underlying spdlog sink pointer.
Definition: elogger.h:285
ELogger::startup
Void startup(cpStr format, const Args &... args)
Writes a startup message to this logger.
Definition: elogger.h:169
ELogger::set_level
Void set_level(spdlog::level::level_enum lvl)
Sets the current log level of the underlying spdlog object.
Definition: elogger.h:205
ELogger::setLogLevel
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:191
DECLARE_ERROR_ADVANCED2
#define DECLARE_ERROR_ADVANCED2(__e__)
Declares exception class derived from EError with an Int as a constructor parameter and developer def...
Definition: eerror.h:67
DECLARE_ERROR_ADVANCED3
#define DECLARE_ERROR_ADVANCED3(__e__)
Declares exception class derived from EError with an Int and a const char * as constructor parameters...
Definition: eerror.h:75
ELogger::getLogLevel
LogLevel getLogLevel()
Retrieve the currently assigned log level.
Definition: elogger.h:194
ELoggerSinkSet::getVector
std::vector< std::shared_ptr< ELoggerSink > > & getVector()
Retrieves the vector of sinks.
Definition: elogger.h:482
ELogger::ELogger
ELogger(Int logid, cpStr category, Int sinkid)
Class constructor.
Definition: elogger.cpp:110
ELogger::info
Void info(cpStr format, const Args &... args)
Writes a info message to this logger.
Definition: elogger.h:164
ELogger::eOff
Disables logging.
Definition: elogger.h:99
ELoggerSinkDailyFile::getFilename
EString & getFilename()
Retrieves the log file name.
Definition: elogger.h:440
ELoggerSinkBasicFile::~ELoggerSinkBasicFile
virtual ~ELoggerSinkBasicFile()
Class destructor.
Definition: elogger.h:372
ELogger::eInfo
Informational.
Definition: elogger.h:89
ebase.h
Macros for various standard C library functions and standard includes.
ELoggerSinkStderr
A standard error sink.
Definition: elogger.h:347
ELoggerSinkRotatingFile::~ELoggerSinkRotatingFile
virtual ~ELoggerSinkRotatingFile()
Class destructor.
Definition: elogger.h:400
ELogger::eMinor
Minor.
Definition: elogger.h:93
ELoggerSinkRotatingFile::getMaxSizeMB
size_t getMaxSizeMB()
Retrieves the maximum log file size.
Definition: elogger.h:407
ELoggerSinkSyslog
A syslog sink.
Definition: elogger.h:319
ELoggerSinkSet::addSink
Void addSink(std::shared_ptr< ELoggerSink > &sink)
Adds a sink to the sink set.
Definition: elogger.h:474
ELoggerSink::eStdout
standard output
Definition: elogger.h:248
ELoggerSinkSet
Defines a group of output sinks that can be assigned to a logger.
Definition: elogger.h:462
ELoggerSinkRotatingFile::ELoggerSinkRotatingFile
ELoggerSinkRotatingFile(ELogger::LogLevel loglevel, cpStr pattern, cpStr filename, size_t maxsizemb, size_t maxfiles, Bool rotateonopen)
Class constructor.
Definition: elogger.cpp:385
ELoggerSink::setSinkPtr
spdlog::sink_ptr setSinkPtr(spdlog::sink_ptr &sinkptr)
Assigns the spdlog pointer value.
Definition: elogger.h:306
ELoggerSink::eDailyFile
a file that rolls over each day at a specified time
Definition: elogger.h:256
ELoggerSink::getLogLevel
ELogger::LogLevel getLogLevel()
Retrieves the log level for this sink.
Definition: elogger.h:267
ELogger::major
Void major(cpStr format, const Args &... args)
Writes a major message to this logger.
Definition: elogger.h:179
ELogger::uninit
static Void uninit()
Shuts down the logging system.
Definition: elogger.cpp:270
ELoggerSinkDailyFile::getRolloverMinute
Int getRolloverMinute()
Retrieves the minute within the hour when the rollover will occur.
Definition: elogger.h:449
ELoggerSink::eBasicFile
a simple file
Definition: elogger.h:252
ELoggerSink::eSyslog
syslog
Definition: elogger.h:246
EGetOpt
Definition: egetopt.h:31
DECLARE_ERROR_ADVANCED4
#define DECLARE_ERROR_ADVANCED4(__e__)
Declares exception class derived from EError with an const char* as a constructor parameter and devel...
Definition: eerror.h:83
ELogger
Defines a logger.
Definition: elogger.h:78
ELoggerSinkSyslog::~ELoggerSinkSyslog
virtual ~ELoggerSinkSyslog()
Class destructor.
Definition: elogger.h:327
ELoggerSinkRotatingFile::getFilename
EString & getFilename()
Retrieves the log file name.
Definition: elogger.h:404
ELogger::applicationName
static EString & applicationName(cpStr app)
Assigns the application name.
Definition: elogger.h:115
ELogger::createSinkSet
static ELoggerSinkSet & createSinkSet(Int sinkid)
Manually creates a sink set.
Definition: elogger.cpp:291
ELoggerSinkBasicFile::getTruncate
Bool getTruncate()
Retrieves the truncate flag.
Definition: elogger.h:379
ELogger::applicationName
static EString & applicationName()
Retrieves the application name.
Definition: elogger.h:112
ELoggerSink::~ELoggerSink
virtual ~ELoggerSink()
Class destructor.
Definition: elogger.h:260
ELoggerSink::setLogLevel
ELogger::LogLevel setLogLevel(ELogger::LogLevel loglevel)
Assigns the sink log level.
Definition: elogger.h:275
ELoggerSinkDailyFile::getRolloverHour
Int getRolloverHour()
Retrieves the hour during the day when the rollover will occur.
Definition: elogger.h:446
eutil.h
Defines various utility functions.
ELoggerSinkSet::getSpdlogVector
std::vector< spdlog::sink_ptr > & getSpdlogVector()
Retrieves the spdlog vector of sinks.
Definition: elogger.h:485
ELoggerSinkDailyFile
A daily file sink.
Definition: elogger.h:423
ELoggerSinkSet::ELoggerSinkSet
ELoggerSinkSet(Int id=-1)
Class constructor.
Definition: elogger.h:468
ELogger::critical
Void critical(cpStr format, const Args &... args)
Writes a critical message to this logger.
Definition: elogger.h:184
ELogger::log
static ELogger & log(Int logid)
Retrieves the requested ELogger object.
Definition: elogger.h:135
ELogger::eCritical
Critical.
Definition: elogger.h:97
ELogger::flush
Void flush()
Flushes any unwritten log messages to the underlying sinks.
Definition: elogger.h:187
ELoggerSinkBasicFile::ELoggerSinkBasicFile
ELoggerSinkBasicFile(ELogger::LogLevel loglevel, cpStr pattern, cpStr filename, Bool truncate)
Class constructor.
Definition: elogger.cpp:357
ELogger::eMajor
Major.
Definition: elogger.h:95
ELogger::createLog
static ELogger & createLog(Int logid, cpStr category, Int sinkid)
Manually creates a logger.
Definition: elogger.cpp:275
ELoggerInit
Definition: elogger.cpp:80
ELogger::LogLevel
LogLevel
Defines the various log levels.
Definition: elogger.h:84
ELoggerSink::getSinkType
SinkType getSinkType()
Retrieves the sink type.
Definition: elogger.h:264
ELogger::~ELogger
~ELogger()
Class destructor.
Definition: elogger.h:108
ELoggerSink::SinkType
SinkType
Defines the type of output sinks.
Definition: elogger.h:243
egetopt.h
Manages configuration parameters from a file and the command line.
ELoggerSinkSet::~ELoggerSinkSet
~ELoggerSinkSet()
Class destructor.
Definition: elogger.h:470
ELoggerSinkStderr::~ELoggerSinkStderr
virtual ~ELoggerSinkStderr()
Class destructor.
Definition: elogger.h:355
ELoggerSink::eRotatingFile
a rotating set of files
Definition: elogger.h:254
EString
String class.
Definition: estring.h:30
ELoggerSinkRotatingFile::getRotateOnOpen
Bool getRotateOnOpen()
Retrieves the rotate on open setting.
Definition: elogger.h:413
ELoggerSinkBasicFile::getFilename
EString & getFilename()
Retrieves the log file name.
Definition: elogger.h:376
ELoggerSinkDailyFile::ELoggerSinkDailyFile
ELoggerSinkDailyFile(ELogger::LogLevel loglevel, cpStr pattern, cpStr filename, Bool truncate, Int rolloverhour, Int rolloverminute)
Class constructor.
Definition: elogger.cpp:370
ELogger::sinkSet
static ELoggerSinkSet & sinkSet(Int sinkid)
Retrieves the requested sink set object.
Definition: elogger.h:147
ELoggerSinkRotatingFile
A rotating file sink.
Definition: elogger.h:387
estring.h
Encapsulates and extends a std::string object.
ELoggerSink
Represents a logger output sink.
Definition: elogger.h:239
ELoggerSinkStdout
A standard output sink.
Definition: elogger.h:333
ELogger::minor
Void minor(cpStr format, const Args &... args)
Writes a minor message to this logger.
Definition: elogger.h:174
ELogger::get_level
spdlog::level::level_enum get_level()
Retrieve the current log level from the underlying spdlog object.
Definition: elogger.h:202
ELogger::debug
Void debug(cpStr format, const Args &... args)
Writes a debug message to this logger.
Definition: elogger.h:159
ELoggerSinkDailyFile::getTruncate
Bool getTruncate()
Retrieves the truncate flag.
Definition: elogger.h:443
ELoggerSinkBasicFile
A basic file sink.
Definition: elogger.h:361
ELoggerSink::eStderr
standard error
Definition: elogger.h:250
ELoggerSink::setPattern
EString & setPattern(cpStr pattern)
Assigns the log message formatting pattern.
Definition: elogger.h:280