Jpp 19.3.0-rc.3
the software that should make you happy
Loading...
Searching...
No Matches
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 */
17namespace JLOGGER {}
18namespace JPP { using namespace JLOGGER; }
19
20namespace 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 {
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 */
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()
Get IP address (decimal-dot notation).
Definition JNetwork.hh:178
static JDateAndTime getDateAndTime
Function object to get current date and time.