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);