Skip to main content

StreamHandler

Struct StreamHandler 

Source
pub struct StreamHandler<W: Write + Send> { /* private fields */ }
Expand description

A Handler that writes formatted records to any Write sink, guarded by a Mutex so a single stream can be shared across threads.

Implementations§

Source§

impl<W: Write + Send> StreamHandler<W>

Source

pub fn new(formatter: Formatter, stream: W) -> Self

Creates a handler from an explicit formatter and stream.

Examples found in repository?
examples/colorized.rs (line 56)
36fn main() {
37    // 1. Build a formatter from a pattern.
38    //
39    //    `%(name)` is a field placeholder. A trailing spec like `-20` controls
40    //    width/alignment: a leading `-` left-aligns, the number is the minimum
41    //    width, and an optional `.N` truncates to N characters. So:
42    //      %(level)-8   -> left-aligned, padded to 8 ("INFO    ")
43    //      %(name).12   -> truncated to at most 12 chars
44    let mut formatter = Formatter::new("%(timestamp) [%(level)-8] %(name)-12 | %(message)");
45
46    // 2. Customize the timestamp rendering (chrono's strftime syntax).
47    formatter.set_time_format("%Y-%m-%d %H:%M:%S");
48
49    // 3. Post-process every rendered line (here: add color).
50    formatter.set_transformer(colorize);
51
52    // 4. Configure the ROOT logger once. Every logger created afterwards
53    //    inherits a snapshot of root's handlers and level, so you typically
54    //    set things up here and then just `Logger::get(...)` everywhere else.
55    let root = Logger::root();
56    root.add_handler(StreamHandler::new(formatter, std::io::stdout()))
57        .expect("root handler lock should not be poisoned at startup");
58    root.set_level(Level::Debug); // emit everything Debug and above
59
60    // 5. Grab a named logger and emit one message per level.
61    let logger = Logger::get("quickstart");
62    logger.debug("a debug message (gray)");
63    logger.info("an info message (blue)");
64    logger.warning("a warning message (yellow)");
65    logger.error("an error message (red)");
66    logger.critical("a critical message (deep red)");
67
68    // 6. Levels below a logger's threshold are dropped cheaply (before
69    //    formatting). Raise the bar and show that Debug/Info now vanish.
70    logger.set_level(Level::Warning);
71    logger.debug("you will NOT see this (below threshold)");
72    logger.info("you will NOT see this either");
73    logger.warning("but warnings still get through");
74}
Source

pub fn with_pattern(stream: W, pattern: &str) -> Self

Convenience constructor that builds a Formatter from pattern.

Examples found in repository?
examples/quickstart.rs (lines 22-25)
14fn main() {
15    // Get a named logger from the global registry. Calling `get` with the same
16    // name again anywhere in the program returns the same logger.
17    let logger = Logger::get("basic");
18
19    // Attach a handler that writes to stdout using a simple pattern.
20    // `%(level)` and `%(message)` are field placeholders.
21    logger
22        .add_handler(StreamHandler::with_pattern(
23            std::io::stdout(),
24            "%(level): %(message)",
25        ))
26        .expect("handler lock should not be poisoned at startup");
27
28    // Emit a few messages. The default level is `Info`, so `debug` is dropped.
29    logger.info("hello from a named logger");
30    logger.warning("something to keep an eye on");
31    logger.error("something went wrong");
32}

Trait Implementations§

Source§

impl<W: Write + Send> Handler for StreamHandler<W>

Source§

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

Renders and writes a single record.
Source§

fn formatter(&self) -> &Formatter

The formatter this handler uses (the logger reads its time_format).

Auto Trait Implementations§

§

impl<W> !Freeze for StreamHandler<W>

§

impl<W> !RefUnwindSafe for StreamHandler<W>

§

impl<W> !UnwindSafe for StreamHandler<W>

§

impl<W> Send for StreamHandler<W>

§

impl<W> Sync for StreamHandler<W>

§

impl<W> Unpin for StreamHandler<W>
where W: Unpin,

§

impl<W> UnsafeUnpin for StreamHandler<W>
where W: UnsafeUnpin,

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> 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, 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.