3 releases (breaking)

0.3.0 Feb 22, 2021
0.2.0 Feb 7, 2019
0.1.0 Feb 3, 2019

#439 in Debugging

Download history 191/week @ 2024-03-14 196/week @ 2024-03-21 263/week @ 2024-03-28 213/week @ 2024-04-04 195/week @ 2024-04-11 155/week @ 2024-04-18 223/week @ 2024-04-25 160/week @ 2024-05-02 176/week @ 2024-05-09 138/week @ 2024-05-16 155/week @ 2024-05-23 142/week @ 2024-05-30 136/week @ 2024-06-06 245/week @ 2024-06-13 299/week @ 2024-06-20 303/week @ 2024-06-27

995 downloads per month
Used in 10 crates (3 directly)


144 lines

log crate extension with NDC-like functionality

Build Status License crates.io

  • log-ndc crate provides a logger which wraps arbitrary logger which prepends thread-local information to each log message
  • log-ndc-env-logger is a very simple (10 lines of code) drop-in wrapper/replacement of env_logger crate


This crate allows settings a thread-local variable which will be prepended to log messages.

log_ndc::set_boxed_logger(logger) wraps passed logger object with log_ndc::Logger and calls underlying log::set_boxed_logger(..).

log_ndc functions like log_ndc::set(..) or log_ndc::push(..) replace thread-local text which is later prepended to log messages in the wrapper logger.

// works exactly like regular `warn!` macro with any logger
// `warn!` is a macro from `log` library
warn!("something happened");

// set thread-local information like request id
log_ndc::set(format!("reqid={}", 10));

info!("starting request");
// outputs
// INFO 2019-02-03T23:51:26Z: mycrate: [reqid=10] starting request


Drop-in replacement/wrapper of env_logger crate.

It simply initialzes env_logger wrapper and wraps it with log_ndc::Logger.

The crate is dead simple, have a look at single file source.


(I think these are FAQ, however nobody asked me anything yet.)

What what NDC means?

The word "NDC" is taken from log4j, it means "nested dianostics context".

Is it compatible with log crate or my favorite backend?

Yes, log-ndc wraps logging backend and delegates it to log crate.

So all macros like warn!(..) should work as before.

See also log-mdc

  • log-mdc is a similar project, which allows storing thread-local data by key. However, log-mdc is compatible only with certain loggers like log4rs. It is not possible to obtain thread-local information set in log-mdc in when e. g. env-logger is used.

Where should we go?

I think it would be right thing if log crate supported basic thread-local context like provided in this crate.