slog

Struct Logger

Source
pub struct Logger<D = Arc<dyn SendSyncRefUnwindSafeDrain<Ok = (), Err = Never>>>
where D: SendSyncUnwindSafeDrain<Ok = (), Err = Never>,
{ /* private fields */ }
Expand description

Logging handle used to execute logging statements

In an essence Logger instance holds two pieces of information:

  • drain - destination where to forward logging Records for processing.
  • context - list of key-value pairs associated with it.

The root Logger is created with a Drain that will be cloned to every member of its hierarchy.

Child Loggers are built from existing ones, and inherit their key-value pairs, which can be supplemented with additional pairs.

Cloning existing loggers and creating new ones is cheap. Loggers can be freely passed around the code and between threads.

Loggers are Sync+Send - there’s no need to synchronize accesses to them, as they can accept logging records from multiple threads at once. They can be sent to any thread. Because of that they require the Drain to be Sync+Send as well. Not all Drains are Sync or Send but they can often be made so by wrapping in a Mutex and/or Arc.

Logger implements Drain trait. Any logging Record delivered to a Logger functioning as a Drain will be delivered to its Drain with existing key-value pairs appended to the Logger’s key-value pairs. By itself, it is effectively very similar to Logger being an ancestor of Logger that originated the logging Record. Combined with other Drains, this allows custom processing logic for a sub-tree of a whole logging tree.

Logger is parametrized over type of a Drain associated with it (D). It default to type-erased version so Logger without any type annotation means Logger<Arc<SendSyncRefUnwindSafeDrain<Ok = (), Err = Never>>>. See Logger::root_typed and Logger::to_erased for more information.

Implementations§

Source§

impl<D> Logger<D>
where D: SendSyncUnwindSafeDrain<Ok = (), Err = Never>,

Source

pub fn root<T>(drain: D, values: OwnedKV<T>) -> Logger
where D: 'static + SendSyncRefUnwindSafeDrain<Err = Never, Ok = ()>, T: SendSyncRefUnwindSafeKV + 'static,

Build a root Logger

Root logger starts a new tree associated with a given Drain. Root logger drain must return no errors. See Drain::ignore_res() and Drain::fuse().

All children and their children (and so on), form one logging tree sharing a common drain. See Logger::new.

This version (as opposed to Logger:root_typed) will take drain and made it into Arc<SendSyncRefUnwindSafeDrain<Ok = (), Err = Never>>. This is typically the most convenient way to work with Loggers.

Use o! macro to build OwnedKV object.

#[macro_use]
extern crate slog;

fn main() {
    let _root = slog::Logger::root(
        slog::Discard,
        o!("key1" => "value1", "key2" => "value2"),
    );
}
Source

pub fn root_typed<T>(drain: D, values: OwnedKV<T>) -> Logger<D>
where D: 'static + SendSyncUnwindSafeDrain<Err = Never, Ok = ()> + Sized, T: SendSyncRefUnwindSafeKV + 'static,

Build a root Logger that retains drain type

Unlike Logger::root, this constructor retains the type of a drain, which allows highest performance possible by eliminating indirect call on Drain::log, and allowing monomorphization of Logger and Drain objects.

If you don’t understand the implications, you should probably just ignore it.

See Logger:into_erased and Logger::to_erased for conversion from type returned by this function to version that would be returned by Logger::root.

Source

pub fn new<T>(&self, values: OwnedKV<T>) -> Logger<D>
where T: SendSyncRefUnwindSafeKV + 'static, D: Clone,

Build a child logger

Child logger inherits all existing key-value pairs from its parent and supplements them with additional ones.

Use o! macro to build OwnedKV object.

§Drain cloning (D : Clone requirement)

All children, their children and so on, form one tree sharing a common drain. This drain, will be Cloned when this method is called. That is why Clone must be implemented for D in Logger<D>::new.

For some Drain types Clone is cheap or even free (a no-op). This is the case for any Logger returned by Logger::root and its children.

When using Logger::root_typed, it’s possible that cloning might be expensive, or even impossible.

The reason why wrapping in an Arc is not done internally, and exposed to the user is performance. Calling Drain::log through an Arc is tiny bit slower than doing it directly.

#[macro_use]
extern crate slog;

fn main() {
    let root = slog::Logger::root(slog::Discard,
        o!("key1" => "value1", "key2" => "value2"));
    let _log = root.new(o!("key" => "value"));
}
Source

pub fn log(&self, record: &Record<'_>)

Log one logging Record

Use specific logging functions instead. See log! macro documentation.

Source

pub fn list(&self) -> &OwnedKVList

Get list of key-value pairs assigned to this Logger

Source

pub fn into_erased( self, ) -> Logger<Arc<dyn SendSyncRefUnwindSafeDrain<Ok = (), Err = Never>>>
where D: SendRefUnwindSafeDrain + 'static,

Convert to default, “erased” type: Logger<Arc<SendSyncUnwindSafeDrain>>

Useful to adapt Logger<D : Clone> to an interface expecting Logger<Arc<...>>.

Note that calling on a Logger<Arc<...>> will convert it to Logger<Arc<Arc<...>>> which is not optimal. This might be fixed when Rust gains trait implementation specialization.

Source

pub fn to_erased( &self, ) -> Logger<Arc<dyn SendSyncRefUnwindSafeDrain<Ok = (), Err = Never>>>
where D: SendRefUnwindSafeDrain + 'static + Clone,

Create a copy with “erased” type

See into_erased

Trait Implementations§

Source§

impl<D> Clone for Logger<D>
where D: SendSyncUnwindSafeDrain<Ok = (), Err = Never> + Clone,

Source§

fn clone(&self) -> Logger<D>

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<D> Debug for Logger<D>
where D: SendSyncUnwindSafeDrain<Ok = (), Err = Never>,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<D> Drain for Logger<D>
where D: SendSyncUnwindSafeDrain<Ok = (), Err = Never>,

Source§

type Ok = ()

Type returned by this drain Read more
Source§

type Err = NeverStruct

Type of potential errors that can be returned by this Drain
Source§

fn log( &self, record: &Record<'_>, values: &OwnedKVList, ) -> Result<Self::Ok, Self::Err>

Handle one logging statement (Record) Read more
Source§

fn is_enabled(&self, level: Level) -> bool

Avoid: Check if messages at the specified log level are maybe enabled for this logger. Read more
Source§

fn is_critical_enabled(&self) -> bool

Avoid: See is_enabled
Source§

fn is_error_enabled(&self) -> bool

Avoid: See is_enabled
Source§

fn is_warning_enabled(&self) -> bool

Avoid: See is_enabled
Source§

fn is_info_enabled(&self) -> bool

Avoid: See is_enabled
Source§

fn is_debug_enabled(&self) -> bool

Avoid: See is_enabled
Source§

fn is_trace_enabled(&self) -> bool

Avoid: See is_enabled
Source§

fn map<F, R>(self, f: F) -> R
where Self: Sized, F: FnOnce(Self) -> R,

Pass Drain through a closure, eg. to wrap into another Drain. Read more
Source§

fn filter<F>(self, f: F) -> Filter<Self, F>
where Self: Sized, F: FilterFn,

Filter logging records passed to Drain Read more
Source§

fn filter_level(self, level: Level) -> LevelFilter<Self>
where Self: Sized,

Filter logging records passed to Drain (by level) Read more
Source§

fn map_err<F, E>(self, f: F) -> MapError<Self, E>
where Self: Sized, F: MapErrFn<Self::Err, E>,

Map logging errors returned by this drain Read more
Source§

fn ignore_res(self) -> IgnoreResult<Self>
where Self: Sized,

Ignore results returned by this drain Read more
Source§

fn fuse(self) -> Fuse<Self>
where Self::Err: Debug, Self: Sized,

Make Self panic when returning any errors Read more

Auto Trait Implementations§

§

impl<D> Freeze for Logger<D>
where D: Freeze,

§

impl<D> RefUnwindSafe for Logger<D>
where D: RefUnwindSafe,

§

impl<D> Send for Logger<D>

§

impl<D> Sync for Logger<D>

§

impl<D> Unpin for Logger<D>
where D: Unpin,

§

impl<D> UnwindSafe for Logger<D>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> SendRefUnwindSafeDrain for T
where T: Drain + Send + RefUnwindSafe + ?Sized,

Source§

impl<T> SendSyncRefUnwindSafeDrain for T
where T: Drain + Send + Sync + RefUnwindSafe + ?Sized,

Source§

impl<T> SendSyncUnwindSafe for T
where T: Send + Sync + UnwindSafe + ?Sized,

Source§

impl<T> SendSyncUnwindSafeDrain for T
where T: Drain + Send + Sync + UnwindSafe + ?Sized,