22 #include "mongodb_log_logger_thread.h"
24 #include <core/threading/mutex.h>
25 #include <core/threading/mutex_locker.h>
27 #include <bsoncxx/builder/basic/document.hpp>
28 #include <mongocxx/client.hpp>
29 #include <mongocxx/exception/operation_exception.hpp>
31 using namespace mongocxx;
43 :
Thread(
"MongoLogLoggerThread",
Thread::OPMODE_WAITFORWAKEUP),
74 MongoLogLoggerThread::insert_message(LogLevel ll,
75 const char *component,
81 bsoncxx::types::b_date nowd{std::chrono::high_resolution_clock::now()};
84 if (vasprintf(&msg, format, va) == -1) {
89 using namespace bsoncxx::builder;
92 case LL_DEBUG: b.append(basic::kvp(
"level",
"DEBUG"));
break;
93 case LL_INFO: b.append(basic::kvp(
"level",
"INFO"));
break;
94 case LL_WARN: b.append(basic::kvp(
"level",
"WARN"));
break;
95 case LL_ERROR: b.append(basic::kvp(
"level",
"ERROR"));
break;
96 default: b.append(basic::kvp(
"level",
"UNKN"));
break;
98 b.append(basic::kvp(
"component", component));
99 b.append(basic::kvp(
"time", nowd));
100 b.append(basic::kvp(
"message", msg));
105 mongodb_client->database(database_)[collection_].insert_one(b.view());
106 }
catch (operation_exception &e) {
112 MongoLogLoggerThread::insert_message(
LogLevel ll,
const char *component,
Exception &e)
116 bsoncxx::types::b_date nowd{std::chrono::high_resolution_clock::now()};
119 using namespace bsoncxx::builder;
122 case LL_DEBUG: b.append(basic::kvp(
"level",
"DEBUG"));
break;
123 case LL_INFO: b.append(basic::kvp(
"level",
"INFO"));
break;
124 case LL_WARN: b.append(basic::kvp(
"level",
"WARN"));
break;
125 case LL_ERROR: b.append(basic::kvp(
"level",
"ERROR"));
break;
126 default: b.append(basic::kvp(
"level",
"UNKN"));
break;
128 b.append(basic::kvp(
"component", component));
129 b.append(basic::kvp(
"time", nowd));
130 b.append(basic::kvp(
"message", std::string(
"[EXCEPTION] ") + *i));
132 mongodb_client->database(database_)[collection_].insert_one(b.view());
133 }
catch (operation_exception &e) {
142 insert_message(
LL_DEBUG, component, format, va);
148 insert_message(
LL_INFO, component, format, va);
154 insert_message(
LL_WARN, component, format, va);
160 insert_message(
LL_ERROR, component, format, va);
167 va_start(arg, format);
168 insert_message(
LL_DEBUG, component, format, arg);
176 va_start(arg, format);
177 insert_message(
LL_INFO, component, format, arg);
185 va_start(arg, format);
186 insert_message(
LL_WARN, component, format, arg);
194 va_start(arg, format);
195 insert_message(
LL_ERROR, component, format, arg);
202 insert_message(
LL_DEBUG, component, e);
208 insert_message(
LL_INFO, component, e);
214 insert_message(
LL_WARN, component, e);
220 insert_message(
LL_ERROR, component, e);
224 MongoLogLoggerThread::tlog_insert_message(
LogLevel ll,
226 const char * component,
233 if (vasprintf(&msg, format, va) == -1) {
237 bsoncxx::types::b_date nowd{
238 std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>{
239 std::chrono::milliseconds{t->tv_sec * 1000 + t->tv_usec / 1000}}};
241 using namespace bsoncxx::builder;
244 case LL_DEBUG: b.append(basic::kvp(
"level",
"DEBUG"));
break;
245 case LL_INFO: b.append(basic::kvp(
"level",
"INFO"));
break;
246 case LL_WARN: b.append(basic::kvp(
"level",
"WARN"));
break;
247 case LL_ERROR: b.append(basic::kvp(
"level",
"ERROR"));
break;
248 default: b.append(basic::kvp(
"level",
"UNKN"));
break;
250 b.append(basic::kvp(
"component", component));
251 b.append(basic::kvp(
"time", nowd));
252 b.append(basic::kvp(
"message", msg));
254 mongodb_client->database(database_)[collection_].insert_one(b.view());
255 }
catch (operation_exception &e) {
265 MongoLogLoggerThread::tlog_insert_message(
LogLevel ll,
267 const char * component,
272 bsoncxx::types::b_date nowd{
273 std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>{
274 std::chrono::milliseconds{t->tv_sec * 1000 + t->tv_usec / 1000}}};
276 using namespace bsoncxx::builder;
279 case LL_DEBUG: b.append(basic::kvp(
"level",
"DEBUG"));
break;
280 case LL_INFO: b.append(basic::kvp(
"level",
"INFO"));
break;
281 case LL_WARN: b.append(basic::kvp(
"level",
"WARN"));
break;
282 case LL_ERROR: b.append(basic::kvp(
"level",
"ERROR"));
break;
283 default: b.append(basic::kvp(
"level",
"UNKN"));
break;
285 b.append(basic::kvp(
"component", component));
286 b.append(basic::kvp(
"time", nowd));
287 b.append(basic::kvp(
"message", std::string(
"[EXCEPTION] ") + *i));
289 mongodb_client->database(database_)[collection_].insert_one(b.view());
290 }
catch (operation_exception &e) {
300 va_start(arg, format);
301 tlog_insert_message(
LL_DEBUG, t, component, format, arg);
309 va_start(arg, format);
310 tlog_insert_message(
LL_INFO, t, component, format, arg);
318 va_start(arg, format);
319 tlog_insert_message(
LL_WARN, t, component, format, arg);
327 va_start(arg, format);
328 tlog_insert_message(
LL_ERROR, t, component, format, arg);
335 tlog_insert_message(
LL_DEBUG, t, component, e);
341 tlog_insert_message(
LL_INFO, t, component, e);
347 tlog_insert_message(
LL_WARN, t, component, e);
353 tlog_insert_message(
LL_ERROR, t, component, e);
358 const char * component,
362 tlog_insert_message(
LL_DEBUG, t, component, format, va);
367 const char * component,
371 tlog_insert_message(
LL_INFO, t, component, format, va);
376 const char * component,
380 tlog_insert_message(
LL_WARN, t, component, format, va);
385 const char * component,
389 tlog_insert_message(
LL_ERROR, t, component, format, va);
virtual void vtlog_info(struct timeval *t, const char *component, const char *format, va_list va)
Log informational message for specific time.
virtual void log_warn(const char *component, const char *format,...)
Log warning message.
MongoLogLoggerThread()
Constructor.
virtual void vtlog_warn(struct timeval *t, const char *component, const char *format, va_list va)
Log warning message for specific time.
virtual void log_info(const char *component, const char *format,...)
Log informational message.
virtual void log_debug(const char *component, const char *format,...)
Log debug message.
virtual void init()
Initialize the thread.
virtual void loop()
Code to execute in the thread.
virtual void finalize()
Finalize the thread.
virtual ~MongoLogLoggerThread()
Destructor.
virtual void tlog_warn(struct timeval *t, const char *component, const char *format,...)
Log warning message for specific time.
virtual void vtlog_error(struct timeval *t, const char *component, const char *format, va_list va)
Log error message for specific time.
virtual void log_error(const char *component, const char *format,...)
Log error message.
virtual void vlog_error(const char *component, const char *format, va_list va)
Log error message.
virtual void tlog_info(struct timeval *t, const char *component, const char *format,...)
Log informational message for specific time.
virtual void vtlog_debug(struct timeval *t, const char *component, const char *format, va_list va)
Log debug message for specific time.
virtual void vlog_debug(const char *component, const char *format, va_list va)
Log debug message.
virtual void tlog_error(struct timeval *t, const char *component, const char *format,...)
Log error message for specific time.
virtual void vlog_info(const char *component, const char *format, va_list va)
Log informational message.
virtual void tlog_debug(struct timeval *t, const char *component, const char *format,...)
Log debug message for specific time.
virtual void vlog_warn(const char *component, const char *format, va_list va)
Log warning message.
Configuration * config
This is the Configuration member used to access the configuration.
virtual std::string get_string_or_default(const char *path, const std::string &default_val)
Get value from configuration which is of type string, or the given default if the path does not exist...
Message iterator for exceptions.
Base class for exceptions in Fawkes.
iterator end() noexcept
Get end iterator for messages.
iterator begin() noexcept
Get iterator for messages.
Thread aspect that allows to provide a logger to Fawkes.
@ LL_INFO
informational output about normal procedures
@ LL_WARN
warning, should be investigated but software still functions, an example is that something was reques...
@ LL_ERROR
error, may be recoverable (software still running) or not (software has to terminate).
@ LL_DEBUG
debug output, relevant only when tracking down problems
LogLevel log_level
Minimum log level.
Thread aspect to access MongoDB.
mongocxx::client * mongodb_client
MongoDB client to use to interact with the database.
Mutex mutual exclusion lock.
Thread class encapsulation of pthreads.
Fawkes library namespace.