qxLib
logger_formatters.inl
Go to the documentation of this file.
1 /**
2 
3  @file logger_formatters.inl
4  @author Khrapov
5  @date 13.02.2026
6  @copyright © Nick Khrapov, 2026. All right reserved.
7 
8 **/
9 
10 namespace qx
11 {
12 
13 template<class out_it_t>
14 inline void append_time_string(
15  out_it_t it,
16  char_type chDateDelimiter,
17  char_type chTimeDelimiter,
18  std::chrono::system_clock::time_point time) noexcept
19 {
20  auto timeSeconds = floor<std::chrono::seconds>(time);
21 
23  it,
24  QXT("{:%d}{}{:%m}{}{:%Y}_{:%H}{}{:%M}{}{:%S}"),
25  timeSeconds,
26  chDateDelimiter,
27  timeSeconds,
28  chDateDelimiter,
29  timeSeconds,
30  timeSeconds,
31  chTimeDelimiter,
32  timeSeconds,
33  chTimeDelimiter,
34  timeSeconds);
35 }
36 
37 constexpr string_view get_verbosity_prefix(verbosity eVerbosity) noexcept
38 {
39  switch (eVerbosity)
40  {
41  case verbosity::detailed:
42  return QXT("[D][");
43 
44  case verbosity::verbose:
45  return QXT("[V][");
46 
47  case verbosity::important:
48  return QXT("[I][");
49 
50  case verbosity::warning:
51  return QXT("[W][");
52 
53  case verbosity::error:
54  return QXT("[E][");
55 
56  case verbosity::critical:
57  return QXT("[C][");
58 
59  default:
60  return QXT(" [");
61  }
62 }
63 
64 inline string format_message_qx(
65  const category& category,
66  verbosity eVerbosity,
67  std::thread::id threadId,
68  std::chrono::system_clock::time_point messageTime,
69  string_view svFile,
70  string_view svFunction,
71  int nLine,
72  string sMessage) noexcept
73 {
74  // avoid extra allocation, insert prefix inplace
75 
76  const string_view svVerbosityPrefix = get_verbosity_prefix(eVerbosity);
77  const string_view svCategory = category.get_name();
78  const bool bAddCategory = !svCategory.empty() && svCategory != CatDefault.get_name();
79 
80  constexpr size_t nTimeSize = 19;
81  const size_t nCategorySize = bAddCategory ? svCategory.size() + 2 : 0;
82  const size_t nPrefixSize = svVerbosityPrefix.size() + nTimeSize + 2 + nCategorySize;
83 
84  sMessage.insert(0, QXT("\0"), nPrefixSize);
85  size_t nPos = 0;
86 
87  std::memcpy(
88  sMessage.data() + nPos,
89  svVerbosityPrefix.data(),
90  svVerbosityPrefix.size() * sizeof(string_view::value_type));
91  nPos += svVerbosityPrefix.size();
92 
93  append_time_string(sMessage.data() + nPos, QXT('.'), QXT(':'), messageTime);
94  nPos += nTimeSize;
95 
96  sMessage[nPos] = QXT(']');
97  nPos += 1;
98 
99  if (bAddCategory)
100  {
101  sMessage[nPos] = QXT('[');
102  nPos += 1;
103 
104  std::memcpy(sMessage.data() + nPos, svCategory.data(), svCategory.size() * sizeof(string::value_type));
105  nPos += svCategory.size();
106 
107  sMessage[nPos] = QXT(']');
108  nPos += 1;
109  }
110 
111  sMessage[nPos] = QXT(' ');
112  nPos += 1;
113 
114  sMessage += QXT('\n');
115 
116  return sMessage;
117 }
118 
119 
120 } // namespace qx
A category is a class that identifies a particular piece of code. This code can be located in differe...
Definition: category.h:59
constexpr string_view get_name() const noexcept
Get category name.
Definition: category.inl:26
void append_time_string(out_it_t it, char_type chDateDelimiter, char_type chTimeDelimiter, std::chrono::system_clock::time_point time) noexcept
Format time string to the buffer.
string format_message_qx(const category &category, verbosity eVerbosity, std::thread::id threadId, std::chrono::system_clock::time_point messageTime, string_view svFile, string_view svFunction, int nLine, string sMessage) noexcept
constexpr string_view get_verbosity_prefix(verbosity eVerbosity) noexcept
Get verbosity prefix.