summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHenrik Edin <henrik.edin@mongodb.com>2020-02-12 09:20:17 -0500
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-02-12 17:58:39 +0000
commita8dc6f18f2ea3ef5c1b4441f18a69ba9de36f6f0 (patch)
treece1aa80198b0730ebe2771a39daab933c0454501 /src
parenta155f64be2d51d2fa3e8ea7247c8545fdb416135 (diff)
downloadmongo-a8dc6f18f2ea3ef5c1b4441f18a69ba9de36f6f0.tar.gz
SERVER-46099 Support capturing toString() that returns StringData in logv2
Diffstat (limited to 'src')
-rw-r--r--src/mongo/logv2/attribute_storage.h41
-rw-r--r--src/mongo/logv2/log.h2
2 files changed, 39 insertions, 4 deletions
diff --git a/src/mongo/logv2/attribute_storage.h b/src/mongo/logv2/attribute_storage.h
index 56d094c8fc5..b1d01c9c9de 100644
--- a/src/mongo/logv2/attribute_storage.h
+++ b/src/mongo/logv2/attribute_storage.h
@@ -146,14 +146,29 @@ template <class T, class = void>
struct HasToString : std::false_type {};
template <class T>
-struct HasToString<T, std::void_t<decltype(std::declval<T>().toString())>> : std::true_type {};
+struct HasToString<T, std::void_t<decltype(std::declval<T>().toString())>>
+ : std::is_same<decltype(std::declval<T>().toString()), std::string> {};
+
+template <class T, class = void>
+struct HasToStringReturnStringData : std::false_type {};
+
+template <class T>
+struct HasToStringReturnStringData<T, std::void_t<decltype(std::declval<T>().toString())>>
+ : std::is_convertible<decltype(std::declval<T>().toString()), StringData> {};
template <class T, class = void>
struct HasNonMemberToString : std::false_type {};
template <class T>
struct HasNonMemberToString<T, std::void_t<decltype(toString(std::declval<T>()))>>
- : std::true_type {};
+ : std::is_same<decltype(toString(std::declval<T>())), std::string> {};
+
+template <class T, class = void>
+struct HasNonMemberToStringReturnStringData : std::false_type {};
+
+template <class T>
+struct HasNonMemberToStringReturnStringData<T, std::void_t<decltype(toString(std::declval<T>()))>>
+ : std::is_convertible<decltype(toString(std::declval<T>())), StringData> {};
template <class T, class = void>
struct HasNonMemberToBSON : std::false_type {};
@@ -236,6 +251,13 @@ auto mapValue(T val) {
CustomAttributeValue custom;
custom.toString = [val]() { return toString(val); };
return custom;
+ } else if constexpr (HasNonMemberToStringReturnStringData<T>::value) {
+ CustomAttributeValue custom;
+ custom.stringSerialize = [val](fmt::memory_buffer& buffer) {
+ StringData sd = toString(val);
+ buffer.append(sd.begin(), sd.end());
+ };
+ return custom;
} else {
return mapValue(static_cast<std::underlying_type_t<T>>(val));
}
@@ -263,8 +285,9 @@ template <
!IsDuration<T>::value && !IsContainer<T>::value,
int> = 0>
CustomAttributeValue mapValue(const T& val) {
- static_assert(HasToString<T>::value || HasStringSerialize<T>::value ||
- HasNonMemberToString<T>::value,
+ static_assert(HasToString<T>::value || HasToStringReturnStringData<T>::value ||
+ HasStringSerialize<T>::value || HasNonMemberToString<T>::value ||
+ HasNonMemberToStringReturnStringData<T>::value,
"custom type needs toString() or serialize(fmt::memory_buffer&) implementation");
CustomAttributeValue custom;
@@ -290,8 +313,18 @@ CustomAttributeValue mapValue(const T& val) {
custom.stringSerialize = [&val](fmt::memory_buffer& buffer) { val.serialize(buffer); };
} else if constexpr (HasToString<T>::value) {
custom.toString = [&val]() { return val.toString(); };
+ } else if constexpr (HasToStringReturnStringData<T>::value) {
+ custom.stringSerialize = [&val](fmt::memory_buffer& buffer) {
+ StringData sd = val.toString();
+ buffer.append(sd.begin(), sd.end());
+ };
} else if constexpr (HasNonMemberToString<T>::value) {
custom.toString = [&val]() { return toString(val); };
+ } else if constexpr (HasNonMemberToStringReturnStringData<T>::value) {
+ custom.stringSerialize = [&val](fmt::memory_buffer& buffer) {
+ StringData sd = toString(val);
+ buffer.append(sd.begin(), sd.end());
+ };
}
return custom;
diff --git a/src/mongo/logv2/log.h b/src/mongo/logv2/log.h
index d946ac5be53..9ca5e99272b 100644
--- a/src/mongo/logv2/log.h
+++ b/src/mongo/logv2/log.h
@@ -47,7 +47,9 @@
#include "mongo/base/status.h"
#include "mongo/bson/util/builder.h"
#include "mongo/logger/log_version_util.h"
+#include "mongo/logger/redaction.h"
#include "mongo/logv2/log_component.h"
+#include "mongo/logv2/log_component_settings.h"
#include "mongo/logv2/log_detail.h"
#include "mongo/logv2/log_domain.h"
#include "mongo/logv2/log_options.h"