13 inline logger::logger() noexcept
18 inline logger::~logger() noexcept
23 template<sbo_poly_assignable_c<base_logger_stream> stream_t>
26 std::unique_lock _(m_StreamsMutex);
27 m_Streams.emplace_back(std::move(stream));
37 std::unique_lock _(m_RegisteredCategoriesMutex);
38 m_RegisteredCategories.emplace(svCategoryName, std::move(data));
45 string_view svFunction,
49 string sMessage = std::move(message.sValue);
53 bool bFormatted =
false;
55 std::shared_lock _(m_RegisteredCategoriesMutex);
56 if (
auto itRegisteredCategory = m_RegisteredCategories.find(
category.
get_name());
57 itRegisteredCategory != m_RegisteredCategories.end())
60 if (data.formatFunction)
63 data.formatFunction(
category, eVerbosity, svFile, svFunction, nLine, std::move(sMessage));
73 std::shared_lock _(m_StreamsMutex);
74 for (
auto& stream : m_Streams)
75 stream->log(
category, eVerbosity, sMessage);
79 m_StringsPool.
release(std::move(sMessage), message.nIndex);
84 std::shared_lock _(m_StreamsMutex);
85 for (
auto& stream : m_Streams)
93 std::unique_lock _(m_StreamsMutex);
99 std::shared_lock _(m_RegisteredCategoriesMutex);
101 if (
auto itRegisteredCategory = m_RegisteredCategories.find(
category.
get_name());
102 itRegisteredCategory != m_RegisteredCategories.end())
105 return eVerbosity >= data.eRuntimeVerbosity;
108 return eVerbosity >= verbosity::log;
113 return &m_StringsPool;
118 verbosity eVerbosity,
120 string_view svFunction,
122 string sMessage) noexcept
126 const string_view svVerbosityPrefix = get_verbosity_prefix(eVerbosity);
128 const bool bAddCategory = !svCategory.empty() && svCategory != CatDefault.get_name();
130 constexpr
size_t nTimeSize = 19;
131 const size_t nCategorySize = bAddCategory ? svCategory.size() + 2 : 0;
132 const size_t nPrefixSize = svVerbosityPrefix.size() + nTimeSize + 2 + nCategorySize;
134 sMessage.insert(0, QXT(
"\0"), nPrefixSize);
138 sMessage.data() + nPos,
139 svVerbosityPrefix.data(),
140 svVerbosityPrefix.size() *
sizeof(string_view::value_type));
141 nPos += svVerbosityPrefix.size();
146 sMessage[nPos] = QXT(
']');
151 sMessage[nPos] = QXT(
'[');
154 std::memcpy(sMessage.data() + nPos, svCategory.data(), svCategory.size() *
sizeof(string::value_type));
155 nPos += svCategory.size();
157 sMessage[nPos] = QXT(
']');
161 sMessage[nPos] = QXT(
' ');
164 sMessage += QXT(
'\n');
173 case verbosity::detailed:
176 case verbosity::verbose:
179 case verbosity::important:
182 case verbosity::warning:
185 case verbosity::error:
188 case verbosity::critical:
A category is a class that identifies a particular piece of code. This code can be located in differe...
constexpr string_view get_name() const noexcept
Get category name.
bool log_required(const category &category, verbosity eVerbosity) const noexcept
Returns true if a log with given category and verbosity will be logged.
void add_stream(stream_t stream) noexcept
Add an output stream to the logger.
void register_category(const category &category, category_data data) noexcept
Add custom rules for category.
virtual void reset() noexcept
Reset logger and clear all streams.
virtual void log(const category &category, verbosity eVerbosity, string_view svFile, string_view svFunction, int nLine, logger_string_pool::item message)
Log to all streams.
static constexpr string_view get_verbosity_prefix(verbosity eVerbosity) noexcept
Get verbosity prefix.
static string default_formatter(const category &category, verbosity eVerbosity, string_view svFile, string_view svFunction, int nLine, string sMessage) noexcept
The default log line formatter.
virtual void flush()
Flush all streams.
Fixed-size atomic string pool.
void release(string sValue, int nIndex)
Return a string back to the pool.
void append_time_string(out_it_t it, char_type chDateDelimiter, char_type chTimeDelimiter) noexcept
Format time string to the buffer.