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