Jpp  master_rocky-37-gf0c5bc59d
the software that should make you happy
JMessageLogger.hh
Go to the documentation of this file.
1 #ifndef __JLOGGER__JMESSAGELOGGER__
2 #define __JLOGGER__JMESSAGELOGGER__
3 
4 #include <string>
5 
6 #include "JSystem/JNetwork.hh"
9 #include "JLogger/JLogger.hh"
10 
11 
12 /**
13  * \file
14  * General purpose message reporting.
15  * \author mdejong
16  */
17 namespace JLOGGER {}
18 namespace JPP { using namespace JLOGGER; }
19 
20 namespace JLOGGER {
21 
25 
26 
27  /**
28  * Message logging tag.
29  */
30  static const std::string MESSAGE_TAG = std::string("MSG");
31 
32 
33  /**
34  * Message logger.
35  *
36  * The class implements the following message functions:
37  *
38  * - debug();
39  * - warning();
40  * - error();
41  * - status();
42  * - notice();
43  *
44  * The argument of these messages is an STL string.\n
45  * The message reported consists of <date time> <host name> <process name> <prefix> <message>\n
46  * where the prefix is "DEBUG", "WARNING", "ERROR", "STATUS" or "NOTICE".\n
47  * A debug level can be specified which is used to filter the message types for reporting.\n
48  * The level OFF will cause the message logger to stop reporting any messages.
49  *
50  * Note that the JXXXStreamer classes can be used for STL ostream compatible message logging
51  * (see JMessageStream.hh).
52  */
54  public JLogger
55  {
56  public:
57 
58  enum JLevel_t {
59  OFF = -1, //!< No logging of messages
60  ERROR = 0, //!< Error; always logged
61  STATUS = 0, //!< Status; always logged
62  WARNING = 1, //!< Warning
63  NOTICE = 2, //!< Notice
64  DEBUG = 3 //!< Debug
65  };
66 
67  typedef std::string JMessage_t;
68 
69 
70  /**
71  * Default constructor.
72  */
74  logger(),
75  host (getIPaddress()),
76  name ("<unknown>")
77  {
78  setLevel(OFF);
79  }
80 
81 
82  /**
83  * Constructor.
84  *
85  * \param __logger pointer to logger
86  * \param __name name
87  * \param __level debug level
88  */
90  const std::string& __name,
91  const int __level = ERROR) :
92  host (getIPaddress()),
93  name (__name)
94  {
95  logger.reset(__logger);
96 
97  setLevel(__level);
98  }
99 
100 
101  /**
102  * Reset logger.
103  *
104  * \param __logger pointer to logger
105  */
106  void reset(JLogger* __logger = NULL)
107  {
108  logger.reset(__logger);
109  }
110 
111 
112  /**
113  * Get debug level.
114  *
115  * \return debug level
116  */
118  {
119  return level;
120  }
121 
122 
123  /**
124  * Set debug level.
125  *
126  * \param __level debug level
127  */
128  void setLevel(const int __level)
129  {
130  if (__level < 0)
131  level = OFF;
132  else if (__level == 0)
133  level = ERROR;
134  else if (__level == 1)
135  level = WARNING;
136  else if (__level == 2)
137  level = NOTICE;
138  else
139  level = DEBUG;
140  }
141 
142 
143  /**
144  * Set debug level.
145  *
146  * \param __level debug level
147  */
148  void setLevel(const JLevel_t __level)
149  {
150  level = __level;
151  }
152 
153 
154  /**
155  * Check validity of logger object.
156  *
157  * This operator returns the state of the logger object.
158  * The object is valid if the logger object is ready for use, else the object is in-valid.
159  * In case the object is in-valid, no messages will be reported.
160  *
161  * \return true if logger ready for use; else false
162  */
163  bool is_valid() const
164  {
165  return logger.is_valid();
166  }
167 
168 
169  /**
170  * Report message.
171  *
172  * \param tag tag
173  * \param message message
174  */
175  virtual void typeout(const std::string& tag,
176  const std::string& message) override
177  {
178  logger->typeout(tag, message);
179  }
180 
181 
182 #define TYPEOUT(LEVEL, MESSAGE) this->typeout(LEVEL, #LEVEL, MESSAGE)
183 
184  void debug (const JMessage_t& message) { TYPEOUT(DEBUG, message); }
185  void warning(const JMessage_t& message) { TYPEOUT(WARNING, message); }
186  void error (const JMessage_t& message) { TYPEOUT(ERROR, message); }
187  void notice (const JMessage_t& message) { TYPEOUT(NOTICE, message); }
188  void status (const JMessage_t& message) { TYPEOUT(STATUS, message); }
189 
190 #undef TYPEOUT
191 
192  protected:
193  /**
194  * Report message.
195  *
196  * \param __level level
197  * \param __prefix prefix
198  * \param __message message
199  */
200  void typeout(const JLevel_t __level,
201  const char* __prefix,
202  const JMessage_t& __message)
203  {
204  if (is_valid() && __level <= level && !__message.empty()) {
205 
206  JMessage_t message;
207 
208  message += getDateAndTime();
209 
210  message += " ";
211  message += host;
212 
213  message += " ";
214  message += name;
215 
216  message += " ";
217  message += __prefix;
218 
219  message += " ";
220  message += __message;
221 
222  typeout(MESSAGE_TAG, message);
223  }
224  }
225 
226 
228  std::string host;
229  std::string name;
231  };
232 
233  /**
234  * Thread-safe message logger.
235  *
236  * This class aims to provide a thread-safe alternative to the JMessageLogger
237  * class. Indeed it can transparently replace a JMessageLogger object
238  * to be used in multi-thread environment.
239  */
241  public JMessageLogger
242  {
243  public:
244 
245  /**
246  * Default constructor.
247  */
250  {}
251 
252 
253  /**
254  * Constructor.
255  *
256  * \param __logger pointer to logger
257  * \param __name name
258  * \param __level debug level
259  */
261  const std::string& __name,
262  const int __level = ERROR) :
263  JMessageLogger(__logger, __name, __level)
264  {}
265 
266 
267  /**
268  * Report message.
269  *
270  * \param tag tag
271  * \param message message
272  */
273  virtual void typeout(const std::string& tag,
274  const std::string& message) override
275  {
277  logger->typeout(tag, message);
278  }
279  };
280 }
281 
282 #endif
Date and time functions.
#define TYPEOUT(LEVEL, MESSAGE)
Hostname and IP address functions.
The template JSharedPointer class can be used to share a pointer to an object.
Interface for logging messages.
Definition: JLogger.hh:22
Thread-safe message logger.
virtual void typeout(const std::string &tag, const std::string &message) override
Report message.
JMessageLoggerThreadSafe()
Default constructor.
JMessageLoggerThreadSafe(JLogger *__logger, const std::string &__name, const int __level=ERROR)
Constructor.
bool is_valid() const
Check validity of logger object.
void error(const JMessage_t &message)
JSharedPointer< JLogger > logger
void warning(const JMessage_t &message)
void setLevel(const JLevel_t __level)
Set debug level.
virtual void typeout(const std::string &tag, const std::string &message) override
Report message.
JMessageLogger()
Default constructor.
void debug(const JMessage_t &message)
void reset(JLogger *__logger=NULL)
Reset logger.
void status(const JMessage_t &message)
@ STATUS
Status; always logged.
@ ERROR
Error; always logged.
@ OFF
No logging of messages.
JMessageLogger(JLogger *__logger, const std::string &__name, const int __level=ERROR)
Constructor.
void notice(const JMessage_t &message)
void typeout(const JLevel_t __level, const char *__prefix, const JMessage_t &__message)
Report message.
JLevel_t getLevel()
Get debug level.
void setLevel(const int __level)
Set debug level.
Message logging.
static const std::string MESSAGE_TAG
Message logging tag.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
std::string getIPaddress(const int ip)
Get IP address (decimal-dot notation).
Definition: JNetwork.hh:154
static JDateAndTime getDateAndTime
Function object to get current date and time.