26 void format(
const spdlog::details::log_msg& msg,
28 spdlog::memory_buf_t& dest)
override {
29 const auto level_sv = spdlog::level::to_string_view(msg.level);
30 std::string level_name(level_sv.data(), level_sv.size());
31 std::ranges::transform(
32 level_name, level_name.begin(), [](
const unsigned char c) { return std::toupper(c); });
33 if (level_name.size() < 8) {
34 const std::size_t pad = 8U - level_name.size();
35 level_name.insert(std::size_t{0}, pad,
' ');
37 spdlog::details::fmt_helper::append_string_view(level_name, dest);
40 [[nodiscard]] std::unique_ptr<custom_flag_formatter> clone()
const override {
41 return std::make_unique<UpperLevelFormatter>();
50 static std::string abbreviate(std::string input,
const std::size_t size) {
55 if (input.size() <= size) {
56 input.append(size - input.size(),
' ');
60 std::vector<std::string_view> parts;
62 std::string_view s(input);
63 std::size_t start = 0;
65 const std::size_t pos = s.find(
'.', start);
66 if (pos == std::string_view::npos) {
67 parts.emplace_back(s.substr(start));
70 parts.emplace_back(s.substr(start, pos - start));
75 auto build = [&](
const std::size_t abbreviated_prefix_count,
76 const bool leading_dot) -> std::string {
81 for (std::size_t i = 0; i < parts.size(); ++i) {
85 if (
const bool is_last = (i + 1 == parts.size());
86 !is_last && i < abbreviated_prefix_count) {
87 if (!parts[i].empty()) {
88 out.push_back(parts[i].front());
97 for (std::size_t abbr = 1; abbr < parts.size(); ++abbr) {
98 if (std::string candidate = build(abbr,
false); candidate.size() <= size) {
99 candidate.append(size - candidate.size(),
' ');
104 while (parts.size() > 1) {
105 parts.erase(parts.begin());
106 if (std::string candidate = build(parts.size() - 1,
true); candidate.size() <= size) {
107 candidate.append(size - candidate.size(),
' ');
112 return input.substr(input.size() - size);
115 void format(
const spdlog::details::log_msg& msg,
117 spdlog::memory_buf_t& dest)
override {
118 const std::string name =
119 abbreviate(std::string(msg.logger_name.data(), msg.logger_name.size()), 20);
120 spdlog::details::fmt_helper::append_string_view(name, dest);
123 [[nodiscard]] std::unique_ptr<custom_flag_formatter> clone()
const override {
124 return std::make_unique<ChannelNameFormatter>();