Jpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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"
7 #include "JSystem/JDate.hh"
9 #include "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
137  level = DEBUG;
138  }
139 
140 
141  /**
142  * Set debug level.
143  *
144  * \param __level debug level
145  */
146  void setLevel(const JLevel_t __level)
147  {
148  level = __level;
149  }
150 
151 
152  /**
153  * Check validity of logger object.
154  *
155  * This operator returns the state of the logger object.
156  * The object is valid if the logger object is ready for use, else the object is in-valid.
157  * In case the object is in-valid, no messages will be reported.
158  *
159  * \return true if logger ready for use; else false
160  */
161  bool is_valid() const
162  {
163  return logger.is_valid();
164  }
165 
166 
167  /**
168  * Report message.
169  *
170  * \param tag tag
171  * \param message message
172  */
173  virtual void typeout(const std::string& tag,
174  const std::string& message)
175  {
176  logger->typeout(tag, message);
177  }
178 
179 
180 #define TYPEOUT(LEVEL, MESSAGE) this->typeout(LEVEL, #LEVEL, MESSAGE)
181 
182  void debug (const JMessage_t& message) { TYPEOUT(DEBUG, message); }
183  void warning(const JMessage_t& message) { TYPEOUT(WARNING, message); }
184  void error (const JMessage_t& message) { TYPEOUT(ERROR, message); }
185  void notice (const JMessage_t& message) { TYPEOUT(NOTICE, message); }
186  void status (const JMessage_t& message) { TYPEOUT(STATUS, message); }
187 
188 #undef TYPEOUT
189 
190  protected:
191  /**
192  * Report message.
193  *
194  * \param __level level
195  * \param __prefix prefix
196  * \param __message message
197  */
198  void typeout(const JLevel_t __level,
199  const char* __prefix,
200  const JMessage_t& __message)
201  {
202  if (is_valid() && __level <= level && !__message.empty()) {
203 
204  JMessage_t message;
205 
206  message += getDateAndTime();
207 
208  message += " ";
209  message += host;
210 
211  message += " ";
212  message += name;
213 
214  message += " ";
215  message += __prefix;
216 
217  message += " ";
218  message += __message;
219 
220  typeout(MESSAGE_TAG, message);
221  }
222  }
223 
224 
226  std::string host;
227  std::string name;
229  };
230 
231  /**
232  * Thread-safe message logger.
233  *
234  * This class aims to provide a thread-safe alternative to the JMessageLogger
235  * class. Indeed it can transparently replace a JMessageLogger object
236  * to be used in multi-thread environment.
237  */
239  public JMessageLogger
240  {
241  public:
242 
243  /**
244  * Default constructor.
245  */
248  {}
249 
250 
251  /**
252  * Constructor.
253  *
254  * \param __logger pointer to logger
255  * \param __name name
256  * \param __level debug level
257  */
259  const std::string& __name,
260  const int __level = ERROR) :
261  JMessageLogger(__logger, __name, __level)
262  {}
263 
264 
265  /**
266  * Report message.
267  *
268  * \param tag tag
269  * \param message message
270  */
271  virtual void typeout(const std::string& tag,
272  const std::string& message)
273  {
275  logger->typeout(tag, message);
276  }
277  };
278 }
279 
280 #endif
JMessageLogger(JLogger *__logger, const std::string &__name, const int __level=ERROR)
Constructor.
JMessageLoggerThreadSafe(JLogger *__logger, const std::string &__name, const int __level=ERROR)
Constructor.
void status(const JMessage_t &message)
#define TYPEOUT(LEVEL, MESSAGE)
Date and time functions.
void reset(JLogger *__logger=NULL)
Reset logger.
Status; always logged.
Interface for logging messages.
Definition: JLogger.hh:22
static const std::string MESSAGE_TAG
Message logging tag.
std::string getIPaddress(const int ip)
Get IP address (decimal-dot notation).
Definition: JNetwork.hh:150
virtual void typeout(const std::string &tag, const std::string &message)
Report message.
static const JDateAndTime getDateAndTime
Function object to get ASCII formatted date and time.
Definition: JDate.hh:115
void notice(const JMessage_t &message)
JMessageLogger()
Default constructor.
The template JSharedPointer class can be used to share a pointer to an object.
void typeout(const JLevel_t __level, const char *__prefix, const JMessage_t &__message)
Report message.
JMessageLoggerThreadSafe()
Default constructor.
JSharedPointer< JLogger > logger
void warning(const JMessage_t &message)
bool is_valid() const
Check validity of logger object.
void setLevel(const JLevel_t __level)
Set debug level.
Error; always logged.
No logging of messages.
void setLevel(const int __level)
Set debug level.
virtual void typeout(const std::string &tag, const std::string &message)
Report message.
Thread-safe message logger.
void error(const JMessage_t &message)
Hostname and IP address functions.
void debug(const JMessage_t &message)
JLevel_t getLevel()
Get debug level.