51 releases (28 breaking)

0.47.0 Mar 10, 2026
0.46.1 Jan 7, 2026
0.46.0 Nov 24, 2025
0.42.0 Jul 29, 2025
0.19.0 Jun 18, 2020

#1626 in Debugging

Download history 3438/week @ 2025-12-19 769/week @ 2025-12-26 4444/week @ 2026-01-02 4269/week @ 2026-01-09 3549/week @ 2026-01-16 6835/week @ 2026-01-23 5931/week @ 2026-01-30 5875/week @ 2026-02-06 3954/week @ 2026-02-13 6506/week @ 2026-02-20 5061/week @ 2026-02-27 5617/week @ 2026-03-06 9003/week @ 2026-03-13 5462/week @ 2026-03-20 6497/week @ 2026-03-27 3629/week @ 2026-04-03

25,861 downloads per month
Used in sentry

MIT license

225KB
4K SLoC

Sentry

Sentry Rust SDK: sentry-slog

Sentry slog Integration.

This mainly provides the SentryDrain, which wraps another slog::Drain and can be configured to forward slog::Records to Sentry. The SentryDrain can be used to create a slog::Logger.

The integration also supports slog::KV pairs. They will be added to the breadcrumb data or the event extra properties respectively.

Examples

use sentry_slog::SentryDrain;

let _sentry = sentry::init(());

let drain = SentryDrain::new(slog::Discard);
let root = slog::Logger::root(drain, slog::o!("global_kv" => 1234));

slog::info!(root, "recorded as breadcrumb"; "breadcrumb_kv" => Some("breadcrumb"));
slog::warn!(root, "recorded as regular event"; "event_kv" => "event");

let breadcrumb = &captured_event.breadcrumbs.as_ref()[0];
assert_eq!(
    breadcrumb.message.as_deref(),
    Some("recorded as breadcrumb")
);
assert_eq!(breadcrumb.data["breadcrumb_kv"], "breadcrumb");
assert_eq!(breadcrumb.data["global_kv"], 1234);

assert_eq!(
    captured_event.message.as_deref(),
    Some("recorded as regular event")
);
assert_eq!(captured_event.extra["event_kv"], "event");
assert_eq!(captured_event.extra["global_kv"], 1234);

slog::crit!(root, "recorded as exception event");

assert_eq!(
    captured_event.message.as_deref(),
    Some("recorded as exception event")
);

The Drain can also be customized with a filter, and a mapper:

use sentry_slog::{exception_from_record, LevelFilter, RecordMapping, SentryDrain};

let drain = SentryDrain::new(slog::Discard)
    .filter(|level| match level {
        slog::Level::Critical | slog::Level::Error => LevelFilter::Event,
        _ => LevelFilter::Ignore,
    })
    .mapper(|record, kv| match record.level() {
        slog::Level::Critical | slog::Level::Error => {
            RecordMapping::Event(exception_from_record(record, kv))
        }
        _ => RecordMapping::Ignore,
    });

When a mapper is specified, a corresponding filter should also be provided.

Resources

License: MIT

  • Discord server for project discussions.
  • Follow @sentry on X for updates.

Dependencies

~4.5–6MB
~107K SLoC