mirror of https://github.com/gabime/spdlog.git
Merge pull request #1 from kirill-nn/sentry-integration
added sentry_sink to push events with breadcrumbpull/2585/head
commit
9fcee563ed
@ -0,0 +1,102 @@
|
||||
#pragma once
|
||||
|
||||
#include "base_sink.h"
|
||||
#include "spdlog/logger.h"
|
||||
#include "spdlog/details/synchronous_factory.h"
|
||||
|
||||
#include <sentry.h>
|
||||
|
||||
namespace spdlog {
|
||||
namespace sinks {
|
||||
|
||||
template<typename Mutex>
|
||||
class sentry_sink : public base_sink<Mutex>
|
||||
{
|
||||
public:
|
||||
explicit sentry_sink(const std::string &dsn)
|
||||
{
|
||||
sentry_options_t *options = sentry_options_new();
|
||||
|
||||
sentry_options_set_dsn(options, dsn.c_str());
|
||||
sentry_options_set_auto_session_tracking(options, false);
|
||||
sentry_options_set_symbolize_stacktraces(options, true);
|
||||
sentry_options_set_backend(options, nullptr);
|
||||
|
||||
sentry_init(options);
|
||||
}
|
||||
|
||||
~sentry_sink()
|
||||
{
|
||||
sentry_close();
|
||||
}
|
||||
|
||||
sentry_sink(const sentry_sink& ) = delete;
|
||||
sentry_sink(sentry_sink&& ) = delete;
|
||||
|
||||
sentry_sink& operator=(const sentry_sink&) = delete;
|
||||
sentry_sink& operator=(sentry_sink&&) = delete;
|
||||
|
||||
protected:
|
||||
void flush_() override {};
|
||||
|
||||
void sink_it_(const details::log_msg &msg) override
|
||||
{
|
||||
auto crumb = sentry_value_new_breadcrumb(msg.logger_name.data(), msg.payload.data());
|
||||
auto location = sentry_value_new_object();
|
||||
|
||||
sentry_value_set_by_key(location, "file", sentry_value_new_string(msg.source.filename));
|
||||
sentry_value_set_by_key(location, "line", sentry_value_new_int32(msg.source.line));
|
||||
sentry_value_set_by_key(location, "func", sentry_value_new_int32(msg.source.funcname));
|
||||
sentry_value_set_by_key(crumb, "data", location);
|
||||
sentry_add_breadcrumb(crumb);
|
||||
|
||||
sentry_level_e sentry_level {};
|
||||
switch (msg.level)
|
||||
{
|
||||
case level::trace:
|
||||
sentry_level = sentry_level_e::SENTRY_LEVEL_DEBUG;
|
||||
break;
|
||||
case level::debug:
|
||||
sentry_level = sentry_level_e::SENTRY_LEVEL_DEBUG;
|
||||
break;
|
||||
case level::info:
|
||||
sentry_level = sentry_level_e::SENTRY_LEVEL_INFO;
|
||||
break;
|
||||
case level::warn:
|
||||
sentry_level = sentry_level_e::SENTRY_LEVEL_WARNING;
|
||||
break;
|
||||
case level::err:
|
||||
sentry_level = sentry_level_e::SENTRY_LEVEL_ERROR;
|
||||
break;
|
||||
case level::critical:
|
||||
sentry_level = sentry_level_e::SENTRY_LEVEL_FATAL;
|
||||
break;
|
||||
case level::off:
|
||||
break;
|
||||
case level::n_levels:
|
||||
break;
|
||||
}
|
||||
|
||||
sentry_capture_event(sentry_value_new_message_event(sentry_level, msg.logger_name.data(), msg.payload.data()));
|
||||
}
|
||||
};
|
||||
|
||||
#include "spdlog/details/null_mutex.h"
|
||||
#include <mutex>
|
||||
using sentry_sink_mt = sentry_sink<std::mutex>;
|
||||
using sentry_sink_st = sentry_sink<spdlog::details::null_mutex>;
|
||||
|
||||
} // namespace sinks
|
||||
|
||||
template<typename Factory = spdlog::synchronous_factory>
|
||||
inline std::shared_ptr<logger> sentry_logger_mt(const std::string &logger_name, const std::string &dsn)
|
||||
{
|
||||
return Factory::template create<sinks::sentry_sink_mt>(logger_name, dsn);
|
||||
}
|
||||
|
||||
template<typename Factory = spdlog::synchronous_factory>
|
||||
inline std::shared_ptr<logger> sentry_logger_st(const std::string &logger_name, const std::string &dsn)
|
||||
{
|
||||
return Factory::template create<sinks::sentry_sink_st>(logger_name, dsn);
|
||||
}
|
||||
} // namespace spdlog
|
Loading…
Reference in New Issue