|
|
@@ -15,6 +15,7 @@
|
|
|
#include <string>
|
|
|
|
|
|
#include "common.h"
|
|
|
+#include "logger/detail/data_accessors.h"
|
|
|
#include "logger/exception.h"
|
|
|
#include "logger/logger.h"
|
|
|
#include "logger/logpacket.h"
|
|
|
@@ -30,15 +31,18 @@ namespace logging { namespace {
|
|
|
os << lp.logger;
|
|
|
}
|
|
|
};
|
|
|
-
|
|
|
- struct time_elapsed_gen : public format::generator_t {
|
|
|
- long long created;
|
|
|
- time_elapsed_gen() : created(millis(now())) {}
|
|
|
- static long long millis(timeval tv) {
|
|
|
- return tv.tv_sec * 1000 + tv.tv_usec / 1000;
|
|
|
+
|
|
|
+ struct thread_name_gen : public detail::thread_info_helper,
|
|
|
+ public format::generator_t {
|
|
|
+ std::string str(logpacket const &) const override {
|
|
|
+ return thread_name();
|
|
|
}
|
|
|
+ };
|
|
|
+
|
|
|
+ struct time_elapsed_gen : public detail::time_elapsed_helper,
|
|
|
+ public format::generator_t {
|
|
|
std::string str(logpacket const & lp) const override {
|
|
|
- return std::to_string(millis(lp.time) - created);
|
|
|
+ return elapsed(lp);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
@@ -48,55 +52,21 @@ namespace logging { namespace {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- void erase_prefix(std::string & str, char const * prefix) {
|
|
|
- size_t size = strlen(prefix);
|
|
|
- if (str.find(prefix, 0, size) == 0) {
|
|
|
- str.erase(0, size);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- void trim_upto_prefix_alpha(std::string & str, char const * prefix) {
|
|
|
- size_t size = strlen(prefix);
|
|
|
- for (size_t i = str.find(prefix); i != std::string::npos;
|
|
|
- i = str.find(prefix, i + 1)) {
|
|
|
- if (isalpha(str[i + size])) {
|
|
|
- str.erase(0, i + size);
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- struct class_info_gen : public format::generator_t {
|
|
|
- size_t components;
|
|
|
- class_info_gen(char const * token) : components(0) {
|
|
|
+ struct class_info_gen : public detail::calling_class_helper,
|
|
|
+ public format::generator_t {
|
|
|
+ static size_t components(char const * token) {
|
|
|
if (token && *token == '{') {
|
|
|
- components = atol(token + 1);
|
|
|
+ return atol(token + 1);
|
|
|
+ } else {
|
|
|
+ return 0;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ class_info_gen(char const * token)
|
|
|
+ : detail::calling_class_helper(components(token)) {}
|
|
|
+
|
|
|
std::string str(logpacket const & lp) const override {
|
|
|
- std::string pf = lp.info.pretty_function;
|
|
|
- std::string func = std::string(lp.info.function) + "(";
|
|
|
- if (pf[pf.find(func)-1] == ' ') {
|
|
|
- return "";
|
|
|
- }
|
|
|
- pf.erase(pf.find(func));
|
|
|
- if (pf.rfind("::", pf.size()) != std::string::npos) {
|
|
|
- pf.erase(pf.size() - 2);
|
|
|
- }
|
|
|
- // Erase virtual prefix
|
|
|
- erase_prefix(pf, "virtual ");
|
|
|
- erase_prefix(pf, "static ");
|
|
|
- trim_upto_prefix_alpha(pf, "> ");
|
|
|
- trim_upto_prefix_alpha(pf, "&");
|
|
|
- pf.erase(0, pf.find(" ") + 1);
|
|
|
- for (size_t i = pf.rfind("::"), c = 1;
|
|
|
- i != std::string::npos && c <= components;
|
|
|
- i = pf.rfind("::", i-1), ++c) {
|
|
|
- if (c == components) {
|
|
|
- pf.erase(0, i + 2);
|
|
|
- }
|
|
|
- }
|
|
|
- return pf;
|
|
|
+ return full_name(lp, "::");
|
|
|
}
|
|
|
};
|
|
|
|
|
|
@@ -183,7 +153,7 @@ namespace logging {
|
|
|
} else if (is('m')) {
|
|
|
return std::make_shared<message_gen>();
|
|
|
} else if (is('t')) {
|
|
|
- return std::make_shared<literal_gen>("???");
|
|
|
+ return std::make_shared<thread_name_gen>();
|
|
|
} else {
|
|
|
std::string error_msg{"unknown format character: '"};
|
|
|
throw unknown_format_specifier{error_msg + *next + "'"};
|