14 : m_svHeader(svHeader)
15 , m_svFooter(svFooter)
16 , m_eMinCatchVerbosity(eMinCaptureVerbosity)
18 std::shared_lock _(
get_logger().get_streams_mutex());
20 if (
auto* pStream =
get_logger().get_stream<error_context_stream>())
22 m_OnMessagesToken = (*pStream->get_on_messages().lock())[std::this_thread::get_id()].add_token(
24 &error_context::on_message);
25 m_OnErrorToken = pStream->get_on_error().lock()->add_token(*
this, &error_context::on_error);
29 inline error_context::~error_context() noexcept
31 std::shared_lock _(
get_logger().get_streams_mutex());
33 if (
auto* pStream =
get_logger().get_stream<error_context_stream>())
35 (*pStream->get_on_messages().lock())[std::this_thread::get_id()].remove(m_OnMessagesToken);
36 pStream->get_on_error().lock()->remove(m_OnErrorToken);
40 inline void error_context::on_message(verbosity eVerbosity, string_view svMessage) noexcept
42 if (eVerbosity >= m_eMinCatchVerbosity)
43 m_sMessages += svMessage;
46 inline void error_context::on_error(std::thread::id errorThreadId) noexcept
48 if (m_ThreadId == errorThreadId && !m_sMessages.empty())
49 QX_LOG(qx::verbosity::log,
"\n{}\n{}{}", m_svHeader, m_sMessages, m_svFooter);
error_context(verbosity eMinCaptureVerbosity, string_view svHeader=QXT("Error context start"), string_view svFooter=QXT("Error context end")) noexcept
error_context object constructor
logger & get_logger() noexcept
Get the logger instance used in QX_LOG macros.
#define QX_LOG(eVerbosity,...)
Log message.