crimson uses seastar logging facility for logging. and the latter uses
fmt::format(). currently, we collect the log message into a string and
pass it to log(fmt,...) as "fmt", but seastar/core/sstring.hh defines
the operator<<(ostream&, const vector<T>&) which is a better match than
our the operator<<(ostream&, const vector<T, Allocator>&). and seastar's
operator<<(ostream&, const vector<T>&) uses "{" and "}" to mark the
begin and end of a vector when printing it. and "{}" is also used by
libfmt to enclose its replacement fields. see
https://fmt.dev/latest/syntax.html. so when a vector is printed using
logging facility in crimson, libfmt chokes when trying to parse it as a
format string. so we have some options, like:
- disable seastar's operator<< implementation
- escape the "{}" when writing the vector to the output stream
- print the message as the args, and use "{}" as the fmt.
the 3rd one is the most straightforward, and probably more performant.
Signed-off-by: Kefu Chai <kchai@redhat.com>
#define dendl_impl \
""; \
_logger.log(crimson::to_log_level(_lv), \
- _out.str().c_str()); \
+ "{}", _out.str().c_str()); \
} \
} while (0)
#elif defined(WITH_SEASTAR) && defined(WITH_ALIEN)