Catch exceptions from async logger. Fix #2618

pull/2744/head
gabime 2 years ago
parent 4c5ee9bb10
commit 1fba68bfe2

@ -26,6 +26,8 @@ SPDLOG_INLINE spdlog::async_logger::async_logger(
// send the log message to the thread pool // send the log message to the thread pool
SPDLOG_INLINE void spdlog::async_logger::sink_it_(const details::log_msg &msg) SPDLOG_INLINE void spdlog::async_logger::sink_it_(const details::log_msg &msg)
{ {
SPDLOG_TRY
{
if (auto pool_ptr = thread_pool_.lock()) if (auto pool_ptr = thread_pool_.lock())
{ {
pool_ptr->post_log(shared_from_this(), msg, overflow_policy_); pool_ptr->post_log(shared_from_this(), msg, overflow_policy_);
@ -34,11 +36,15 @@ SPDLOG_INLINE void spdlog::async_logger::sink_it_(const details::log_msg &msg)
{ {
throw_spdlog_ex("async log: thread pool doesn't exist anymore"); throw_spdlog_ex("async log: thread pool doesn't exist anymore");
} }
}
SPDLOG_LOGGER_CATCH(msg.source)
} }
// send flush request to the thread pool // send flush request to the thread pool
SPDLOG_INLINE void spdlog::async_logger::flush_() SPDLOG_INLINE void spdlog::async_logger::flush_()
{ {
SPDLOG_TRY
{
if (auto pool_ptr = thread_pool_.lock()) if (auto pool_ptr = thread_pool_.lock())
{ {
pool_ptr->post_flush(shared_from_this(), overflow_policy_); pool_ptr->post_flush(shared_from_this(), overflow_policy_);
@ -47,6 +53,8 @@ SPDLOG_INLINE void spdlog::async_logger::flush_()
{ {
throw_spdlog_ex("async flush: thread pool doesn't exist anymore"); throw_spdlog_ex("async flush: thread pool doesn't exist anymore");
} }
}
SPDLOG_LOGGER_CATCH(source_loc())
} }
// //

@ -185,6 +185,14 @@ TEST_CASE("to_file multi-workers", "[async]")
logger->info("Hello message #{}", j); logger->info("Hello message #{}", j);
} }
} }
require_message_count(TEST_FILENAME, messages); require_message_count(TEST_FILENAME, messages);
} }
TEST_CASE("bad_tp", "[async]")
{
auto test_sink = std::make_shared<spdlog::sinks::test_sink_mt>();
std::shared_ptr<spdlog::details::thread_pool> const empty_tp;
auto logger = std::make_shared<spdlog::async_logger>("as", test_sink, empty_tp);
logger->info("Please throw an exception");
REQUIRE(test_sink->msg_counter() == 0);
}

Loading…
Cancel
Save