aboutsummaryrefslogtreecommitdiff
path: root/zenserver/zenserver.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-04-25 14:50:29 +0200
committerGitHub <[email protected]>2023-04-25 14:50:29 +0200
commit0d0697cbe19ed2ef385408f72d754cea99c7bc9a (patch)
tree9d05fec6bf2356b56fa432e3e97946adacfc9466 /zenserver/zenserver.cpp
parent0.2.5 (diff)
downloadzen-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.cpp38
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;