16 template<sbo_poly_assignable_c<base_logger_stream> stream_t>
17 static constexpr
auto logger_stream_filter = [](
const logger::logger_sbo& stream)
19 return stream->is<stream_t>();
24 inline logger::logger() noexcept
29 inline logger::~logger() noexcept
34 template<sbo_poly_assignable_c<base_logger_stream> stream_t>
37 std::unique_lock _(m_StreamsMutex);
38 m_Streams.emplace_back(std::move(stream));
41 template<sbo_poly_assignable_c<base_logger_stream> stream_t>
44 auto it = std::ranges::find_if(m_Streams, details::logger_stream_filter<stream_t>);
45 return it != m_Streams.end() ?
static_cast<stream_t*
>(&it->get()) :
nullptr;
48 template<sbo_poly_assignable_c<base_logger_stream> stream_t>
51 return m_Streams | std::views::filter(details::logger_stream_filter<stream_t>)
52 | std::views::transform(
55 return static_cast<stream_t*
>(&stream.
get());
61 return m_StreamsMutex;
64 template<sbo_poly_assignable_c<base_logger_stream> stream_t>
67 std::unique_lock _(m_StreamsMutex);
68 return std::erase_if(m_Streams, details::logger_stream_filter<stream_t>);
78 std::unique_lock _(m_RegisteredCategoriesMutex);
79 m_RegisteredCategories.emplace(svCategoryName, std::move(data));
84 m_DefaultFormatFunction = pFormatter;
90 std::thread::id threadId,
91 std::chrono::system_clock::time_point messageTime,
93 string_view svFunction,
97 string sMessage = std::move(message.sValue);
101 if (eMessageNecessity != message_necessity_type::not_required)
103 bool bFormatted =
false;
105 std::shared_lock _(m_RegisteredCategoriesMutex);
106 if (
auto itRegisteredCategory = m_RegisteredCategories.find(
category.
get_name());
107 itRegisteredCategory != m_RegisteredCategories.end())
110 if (data.formatFunction)
112 sMessage = data.formatFunction(
120 std::move(sMessage));
129 sMessage = m_DefaultFormatFunction.load()(
137 std::move(sMessage));
141 std::shared_lock _(m_StreamsMutex);
142 for (
auto& stream : m_Streams)
144 if (eMessageNecessity != message_necessity_type::one_of_streams_requires
145 || stream->log_unconditionally_required(
154 stream->log(
category, eVerbosity, threadId, messageTime, svFile, svFunction, nLine, sMessage);
160 m_StringsPool.
release(std::move(sMessage), message.nIndex);
165 std::shared_lock _(m_StreamsMutex);
166 for (
auto& stream : m_Streams)
175 std::unique_lock _(m_StreamsMutex);
180 std::unique_lock _(m_RegisteredCategoriesMutex);
181 m_RegisteredCategories.clear();
189 verbosity eVerbosity,
190 std::thread::id threadId,
191 std::chrono::system_clock::time_point messageTime,
193 string_view svFunction,
194 int nLine)
const noexcept
198 std::shared_lock _(m_StreamsMutex);
199 const bool bSomeStreamRequires = std::ranges::any_of(
201 [&
category, eVerbosity, threadId, messageTime, svFile, svFunction, nLine](
const auto& stream)
203 return stream->log_unconditionally_required(
212 if (bSomeStreamRequires)
213 eMessageNecessity |= message_necessity_type::one_of_streams_requires;
217 std::shared_lock _(m_RegisteredCategoriesMutex);
218 if (
auto itRegisteredCategory = m_RegisteredCategories.find(
category.
get_name());
219 itRegisteredCategory != m_RegisteredCategories.end())
222 if (eVerbosity >= data.eRuntimeVerbosity)
223 eMessageNecessity |= message_necessity_type::category_verbosity;
227 if (eVerbosity >= verbosity::log)
228 eMessageNecessity |= message_necessity_type::default_verbosity;
230 return eMessageNecessity;
235 return &m_StringsPool;
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.
Wrapper for enumerations to be used as a list of flags.
virtual void log(const category &category, verbosity eVerbosity, std::thread::id threadId, std::chrono::system_clock::time_point messageTime, string_view svFile, string_view svFunction, int nLine, logger_string_pool::item message)
Log to all streams.
size_t remove_streams() noexcept
Remove all the streams of the given type.
auto get_streams() noexcept
Get all the streams of the given type.
flags< message_necessity_type > get_message_necessity_type(const category &category, verbosity eVerbosity, std::thread::id threadId, std::chrono::system_clock::time_point messageTime, string_view svFile, string_view svFunction, int nLine) const noexcept
Check if this message will go somewhere.
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.
std::shared_mutex & get_streams_mutex() noexcept
Get streams mutex.
stream_t * get_stream() noexcept
Get the first occurrence of a stream of the given type.
virtual void reset() noexcept
Reset logger and clear all streams.
void set_default_formatter(format_function_pointer pFormatter) noexcept
Set a function that will be used as the default formatter in case no formatter found in categories re...
virtual void flush()
Flush all streams.
Small Buffer Object for polymorphic classes.
base_t & get() noexcept
Get object reference. Always valid.
Fixed-size atomic string pool.
void release(string sValue, int nIndex)
Return a string back to the pool.