diff options
| author | Dan Engelbrecht <[email protected]> | 2023-04-25 14:50:29 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-04-25 14:50:29 +0200 |
| commit | 0d0697cbe19ed2ef385408f72d754cea99c7bc9a (patch) | |
| tree | 9d05fec6bf2356b56fa432e3e97946adacfc9466 /zenserver/zenserver.cpp | |
| parent | 0.2.5 (diff) | |
| download | zen-0d0697cbe19ed2ef385408f72d754cea99c7bc9a.tar.xz zen-0d0697cbe19ed2ef385408f72d754cea99c7bc9a.zip | |
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
Diffstat (limited to 'zenserver/zenserver.cpp')
| -rw-r--r-- | zenserver/zenserver.cpp | 38 |
1 files changed, 37 insertions, 1 deletions
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 <sentry.h> +# include <spdlog/sinks/base_sink.h> 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<spdlog::details::null_mutex> + { + 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<utils::sentry_sink>("sentry"); + zen::logging::SetErrorLog(std::move(SentrySink)); } - auto _ = zen::MakeGuard([] { sentry_close(); }); + auto _ = zen::MakeGuard([] { + zen::logging::SetErrorLog(std::shared_ptr<spdlog::logger>()); + sentry_close(); + }); #endif auto& ServerOptions = m_ServerOptions; |