NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1026 most downloaded on crates.io
Structured, extensible, composable logging for Rust
Last release 12 months ago
11 Oct 2025
Release timing varies
gaps range from 2 weeks to 2.8 years
Most releases are documented
notes for 33 of 48 stable releases
8 versions withdrawn
withdrawn after publishing
10 years old
70 releases · first in 2016
Fix use of # operator in macros due to private field (issue #364)
# operator in macros due to private field (issue #364)
-Zminimal-versionsThis fixes an accidental breaking change in the v2.8.0 release, where the public API was changed from erased_serde v0.4 to erased_serde v0.3. This sho…
This fixes an accidental breaking change in the v2.8.0 release,
where the public API was changed from erased_serde v0.4 to erased_serde v0.3.
This should not affect normal users of the API but could break drains supporting nested-values.
I (@Techcable) apologize for this breakage and have yanked the 2.8.0 release due to this issue. I will try to setup cargo-semver-checks in the CI to avoid this in the future.
erased-serde version 0.3.
erased-serde version 0.4 may be provided again in a
future version, but will be done so in a backwards compatible way.-Zminimal-versions flag by specifying minimal dependency versions (fixes #357)One column per quarter.
Deprecate the old slog_log! macros in favor of slog::log!
This is the biggest slog release since 2.0. It fully preserves compatibility with prior releases.
nested-values feature by default.
The next major release of slog_json, slog_term, etc should also enable this feature by default.Logger::flush and Drain::flush methods.# log specifier transparently support & references to errorslog::Value for Box<dyn std::error::Error> and anyhow::Errorprelude module for common importsslog_log! macros in favor of slog::log!nested-values feature by default.erased-serde, syn, serde_core, and many other important crates in the rust ecosystem.erased-serde from v0.3 to v0.4serde_core rather than serde to reduce compile times.Logger::flush and Drain::flush methods
prelude module for common imports.
Replace use slog::{Serde, Logger, info, debug, trace} with use slog::prelude::*parking_lot::Mutex.
This is noticeably faster than std::sync::Mutex, is smaller, and avoids poisoning.
parking_lot at once. The current version (v0.12) has feature name parking_lot_0_12dyn std::error::Error and Box<dyn std::error:Error (along with the Send/Sync versions).anyhow::Error (requires anyhow feature)ErrorRef wrapper to enable logging error references (PR #327)
# error formatter in macros was updated to automatically select ErrorValue or ErrorRef (PR #328)emit_bytes method (PR #290)
BytesKind enumValue for std::borrow::Cowslog_log.
Rust 2018 macro paths like slog::log! make these unnecessary.ErrorRef in PR #327)std::error::Error has been moved to core.
On this rust version, slog now supports the error trait without requiring std.#[must_use] to most public types, including slog::Logger, slog::OwnedKV, and slog::FnValue.nested-values feature is unsupported.slog::Never type to std::convert::Infallible, fixing issue #209.slog::Logger doc
#[warn(clippy::doc_lazy_continuation)]#[warn(unexpected_cfgs)] lint.clippy::must-use-candidateserde_derive crate to implement the nested-values feature.
We depend on the new serde_core instead of even requiring serde.nested-values feature no longer requires serde/std (was a mistake).wasm32-unknown-emscripten target.feature="nothreads"
rustfmt --check now run by defaultclippy to succeed without warningsnested-values feature on MSRV (1.49),
because erased-serde dependency requires edition="2021" (needs 1.56)# format when not used as a last argument.AsRef<str> implementations when using dynamic-keys feature.slog::Level::Warning (fixes issue #282)Final release waiting for more feedback on PR #346 , which would make nested-values a default feature.
Final release waiting for more feedback on PR #346,
which would make nested-values a default feature.
Nothing published for this version
Update to Rust 2018 Enable Github Actions
Update to Rust 2018
Enable Github Actions
Significant internal refactoring and cleanup.
Implement Hash for Level and FilterLevel
Some minor improvements:
Hash for Level and FilterLevelEq for dynamic Keysemit_error to Serializer, # for serializing foreign errors, andimpl Value for std::io::ErrorRetroactively tagged by Techcable
Hash for Level and FilterLevelEq for dynamic Keysemit_error to Serializer, # for serializing foreign errors, and
impl Value for std::io::ErrorSerde (if nested-values feature is enabled) to optionally wrap a value
that implements [serde::Serialize] so it's written to the log record as an
object, rather than a primitive.Restored parsing of Level and FilterLevel truncated names
Level and FilterLevel truncated namesAdded parsing of Level and FilterLevel short names
Level and FilterLevel short namesAdded as_str, as_short_str and Display to FilterLevel
FilterLevel::acceptsas_str, as_short_str and Display to FilterLeveldisable support for i128/u128 types if rustc is old
WARNING: This is a breaking change that we couldn't avoid. Users using explicitly macro import (like #[macro_use(slog_o)]) must add __slog_builtin to…
#[macro_use(slog_o)]) must add
__slog_builtin to the import list.* impl Value for SocketAddr
impl Value for SocketAddrMake ? and % formatters in kv! more flexible
? and % formatters in kv! more flexibleNothing published for this version
Export local inner macros to help with Rust 2018 testing
Record::new? and % formatters in kv! more flexibleFix (again) problems introduced by 2.2.1
2.2.1Fix problems introduced by 2.2.1
2.2.1Add is_x_enabled() for queering (imprecise) log-level
is_x_enabled() for queering (imprecise) log-levelNothing published for this version
Support for nested-values through emit_serde, behind nested-values feature flag, disabled by default for backward compatibility. Note: Consider unstab
emit_serde, behind nested-values feature flag,
disabled by default for backward compatibility. Note: Consider unstable for the time
being.String vs &'static str), behind dynamic-keys feature
flag, disabled by default for backward compatibility. Note: Consider unstable for
the time being.### Changed * #[allow(dead_code) on unused log statements
#[allow(dead_code) on unused log statements### Changed * Impl Value for std::Display
Value for std::path::DisplayRemove unnecessary 'static bound on FnValue
FnValue### Changed * Update README
Nothing published for this version
Fix for https://github.com/rust-lang/rust/pull/42125
### Changed * Relicense under MPL/Apache/MIT
### Fixed * Documentation improvements
### Fixed * Documentation fixes
Compile time logging level filtering
Nothing published for this version
Unified and simplified logging macros structure and ordering.
tags.impl KV for MyStruct.kv! can be used to create on stack key-value list.KV-implementing data can appear on the key-value list directly.OwnedKVLists. Existing Logger can be used as a Drain
to allow custom handling logic for a part of the logging hierarchy.Ok type to Drain.Drains unwind safety.Record to optimize performance on async operations.slog-extra has been renamed to slog-async since that's the only functionality it contained.slog-stream is obsoleted and won't be used in slog v2 at all. It was a wrong abstraction.
Decorators functionality was moved to slog-term.slog-term provides open Decorator traits to allow multiple terminal / file writing backends.slog-term default Decorators use term crate and should work correctly on all supported OSes.DrainExt has been removed and utility methods moved directly to Drainslog-stdlog utilizes slog-scope directly.Loggers to allow squeezing last drops of performance possible,
at the cost of T in Logger<T>.Nothing published for this version
Nothing published for this version
Nothing published for this version
Support for fmt::Display values with % in kv!
fmt::Display values with % in kv!Added support for own KV and Value implementations
KV and Value implementationslog! and friends; BREAKINGFnValue wrapper; BREKINGkv! macro### Fixes * Bunch of trait-related fixes
Require MapErr and Filter to be UnwindSafe
MapErr and Filter to be UnwindSafeMake Logger::root return "erased" version
Logger::root return "erased" versionLogger::root_typed for "non-erased" Logger creationParametrize Logger over the Drain it holds and introduce "erased" version
fmt::Debug for MutexDrainErrorLogger over the Drain it holds and introduce "erased" versionUnwindSafe Drains for LoggersOwnedKVListsOk type to DrainRecord to optimize performance on async
operations1.15.0DrainExt has been removed and utility methods moved directly to DrainOwnedKV and BorrowedKVLogger implements DrainNothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Order of key-value pairs is now strictly defined
Logger implements DrainOwnedKeyValueListFix an invalid syntax exposed by nightly rust change (Issue #103)
### Changed * Updated documentation ### Deprecated * OwnedKeyValueList::id
OwnedKeyValueList::idslog_o as an alternative name for o
slog_o as an alternative name for o### Fixed * Cargo publishing mistake.
BREAKING: Removed default Send+Sync from Drain
Send+Sync from DrainOwnedKeyValueList::id for owned key value unique identification
OwnedKeyValueList::id for owned key value unique identificationBREAKING: Serializer takes key : &'static str now
Serializer takes key : &'static str nowinfo!(...) and other macrosBREAKING: Rewrite handling of owned values.
Implement fmt::Debug for Logger
use std in o!fmt::Debug for LoggerFirst stable release.
First stable release.
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →