From 0d0697cbe19ed2ef385408f72d754cea99c7bc9a Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Tue, 25 Apr 2023 14:50:29 +0200 Subject: fix sentry report callstack (#256) * Include file, line and function in sentry log error messages * use sync direct error logger to get correct call stacks on error * changelog * use d1trimfile on windows to shorten file path on windows * constexpr -> consteval --- zenserver/zenserver.cpp | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'zenserver/zenserver.cpp') diff --git a/zenserver/zenserver.cpp b/zenserver/zenserver.cpp index 5b861f1bc..635fd04e0 100644 --- a/zenserver/zenserver.cpp +++ b/zenserver/zenserver.cpp @@ -80,6 +80,7 @@ ZEN_THIRD_PARTY_INCLUDES_END # define SENTRY_BUILD_STATIC 1 ZEN_THIRD_PARTY_INCLUDES_START # include +# include ZEN_THIRD_PARTY_INCLUDES_END // Sentry currently does not automatically add all required Windows @@ -121,6 +122,35 @@ namespace zen { using namespace std::literals; namespace utils { +#if ZEN_USE_SENTRY + class sentry_sink final : public spdlog::sinks::base_sink + { + public: + sentry_sink() {} + + protected: + static constexpr sentry_level_t MapToSentryLevel[spdlog::level::level_enum::n_levels] = {SENTRY_LEVEL_DEBUG, + SENTRY_LEVEL_DEBUG, + SENTRY_LEVEL_INFO, + SENTRY_LEVEL_WARNING, + SENTRY_LEVEL_ERROR, + SENTRY_LEVEL_FATAL, + SENTRY_LEVEL_DEBUG}; + + void sink_it_(const spdlog::details::log_msg& msg) override + { + std::string Message = fmt::format("{}\n{}({}) [{}]", msg.payload, msg.source.filename, msg.source.line, msg.source.funcname); + sentry_value_t event = sentry_value_new_message_event( + /* level */ MapToSentryLevel[msg.level], + /* logger */ nullptr, + /* message */ Message.c_str()); + sentry_event_value_add_stacktrace(event, NULL, 0); + sentry_capture_event(event); + } + void flush_() override {} + }; +#endif + asio::error_code ResolveHostname(asio::io_context& Ctx, std::string_view Host, std::string_view DefaultPort, @@ -937,9 +967,15 @@ ZenEntryPoint::Run() // sentry_options_set_debug(SentryOptions, 1); SentryErrorCode = sentry_init(SentryOptions); + + auto SentrySink = spdlog::create("sentry"); + zen::logging::SetErrorLog(std::move(SentrySink)); } - auto _ = zen::MakeGuard([] { sentry_close(); }); + auto _ = zen::MakeGuard([] { + zen::logging::SetErrorLog(std::shared_ptr()); + sentry_close(); + }); #endif auto& ServerOptions = m_ServerOptions; -- cgit v1.2.3