Catch sink exceptions without affecting other sinks

This commit is contained in:
gabime 2019-07-17 16:01:30 +03:00
parent 12470f6221
commit 11472eddbc
3 changed files with 25 additions and 80 deletions

View File

@ -65,14 +65,7 @@ SPDLOG_INLINE void spdlog::async_logger::backend_log_(const details::log_msg &in
}
}
}
catch (const std::exception &ex)
{
err_handler_(ex.what());
}
catch (...)
{
err_handler_("Unknown exception in logger");
}
SPDLOG_LOGGER_CATCH()
if (should_flush_(incoming_log_msg))
{
@ -89,14 +82,7 @@ SPDLOG_INLINE void spdlog::async_logger::backend_flush_()
sink->flush();
}
}
catch (const std::exception &ex)
{
err_handler_(ex.what());
}
catch (...)
{
err_handler_("Unknown exception in logger");
}
SPDLOG_LOGGER_CATCH()
}
SPDLOG_INLINE std::shared_ptr<spdlog::logger> spdlog::async_logger::clone(std::string new_name)

View File

@ -65,19 +65,8 @@ SPDLOG_INLINE void logger::log(source_loc loc, level::level_enum lvl, string_vie
return;
}
try
{
details::log_msg log_msg(loc, string_view_t(name_), lvl, msg);
sink_it_(log_msg);
}
catch (const std::exception &ex)
{
err_handler_(ex.what());
}
catch (...)
{
err_handler_("Unknown exception in logger");
}
}
SPDLOG_INLINE void logger::log(level::level_enum lvl, string_view_t msg)
@ -137,18 +126,7 @@ SPDLOG_INLINE void logger::set_pattern(std::string pattern, pattern_time_type ti
// flush functions
SPDLOG_INLINE void logger::flush()
{
try
{
flush_();
}
catch (const std::exception &ex)
{
err_handler_(ex.what());
}
catch (...)
{
err_handler_("Unknown exception in logger");
}
}
SPDLOG_INLINE void logger::flush_on(level::level_enum log_level)
@ -192,9 +170,13 @@ SPDLOG_INLINE void logger::sink_it_(details::log_msg &msg)
for (auto &sink : sinks_)
{
if (sink->should_log(msg.level))
{
try
{
sink->log(msg);
}
SPDLOG_LOGGER_CATCH()
}
}
if (should_flush_(msg))
@ -206,9 +188,13 @@ SPDLOG_INLINE void logger::sink_it_(details::log_msg &msg)
SPDLOG_INLINE void logger::flush_()
{
for (auto &sink : sinks_)
{
try
{
sink->flush();
}
SPDLOG_LOGGER_CATCH()
}
}
SPDLOG_INLINE bool logger::should_flush_(const details::log_msg &msg)

View File

@ -27,6 +27,10 @@
#include <vector>
#include <functional>
#define SPDLOG_LOGGER_CATCH() \
catch (const std::exception &ex) { err_handler_(ex.what());} \
catch (...) {err_handler_("Unknown exception in logger");}
namespace spdlog {
class logger
{
@ -72,14 +76,7 @@ public:
details::log_msg log_msg(loc, name_, lvl, string_view_t(buf.data(), buf.size()));
sink_it_(log_msg);
}
catch (const std::exception &ex)
{
err_handler_(ex.what());
}
catch (...)
{
err_handler_("Unknown exception in logger");
}
SPDLOG_LOGGER_CATCH()
}
template<typename... Args>
@ -150,20 +147,10 @@ public:
{
return;
}
try
{
details::log_msg log_msg(loc, name_, lvl, msg);
sink_it_(log_msg);
}
catch (const std::exception &ex)
{
err_handler_(ex.what());
}
catch (...)
{
err_handler_("Unknown exception in logger");
}
}
// T cannot be statically converted to string_view
template<class T, typename std::enable_if<!std::is_convertible<T, spdlog::string_view_t>::value, T>::type * = nullptr>
@ -180,14 +167,7 @@ public:
details::log_msg log_msg(loc, name_, lvl, string_view_t(buf.data(), buf.size()));
sink_it_(log_msg);
}
catch (const std::exception &ex)
{
err_handler_(ex.what());
}
catch (...)
{
err_handler_("Unknown exception in logger");
}
SPDLOG_LOGGER_CATCH()
}
template<typename T>
@ -250,14 +230,7 @@ public:
details::log_msg log_msg(source, name_, lvl, string_view_t(buf.data(), buf.size()));
sink_it_(log_msg);
}
catch (const std::exception &ex)
{
err_handler_(ex.what());
}
catch (...)
{
err_handler_("Unknown exception in logger");
}
SPDLOG_LOGGER_CATCH()
}
template<typename... Args>