| Crates.io | slog-nursery |
| lib.rs | slog-nursery |
| version | 0.1.0 |
| created_at | 2016-09-20 05:56:41.48055+00 |
| updated_at | 2016-09-20 05:56:41.48055+00 |
| description | Staging area for slog-rs |
| homepage | https://github.com/dpc/slog-rs |
| repository | https://github.com/dpc/slog-rs |
| max_upload_size | |
| id | 6554 |
| size | 1,834 |
Documentation (master branch)
Documentation (release)
FAQ
Testing, feedback, PRs, etc. are very welcome. I'd be also very happy to share the ownership of the project with other people to make it more community-driven.
Long term goal is to make it a go-to logging crate for Rust.
#![no_std] support (with opt-out std cargo feature flag)log crate (slog-stdlog crate)
crates/example-liblog crate)slog-envlogger - port of env_loggerslog-term crate)slog-json crate)
slog-bunyan crate)slog-syslog crate)log crateslog provides core functionality, and some standard
feature-set. But using traits, anyone can easily implement as
powerful fully-custom features, publish separately and grow slog feature-set
for everyone.env_logger, but output authentication messages to syslog,
while reporting errors over network in json format? With slog drains can
reuse other drains! You can combine them together, chain, wrap - you name it.log you would have to repeat this information in
every log statement. In slog it will happen automatically. See
slog-rs functional overview page to understand better
logger and drain hierarchies and log record flow through them.AsyncStreamer drain, and closures
to make your logging fast.AtomicSwitch drain allows
changing logging behavior in the running program. You could use eg. signal
handlers to change logging level or logging destinations. See
signal example.Full mode:

Compact mode:

Excerpt from examples/features.rs:
fn main() {
// Create a new drain hierarchy, for the need of your program.
// Choose from collection of existing drains, or write your own
// `struct`-s implementing `Drain` trait.
let drain = slog_term::streamer().async().full().build();
// `AtomicSwitch` is a drain that wraps other drain and allows to change
// it atomically in runtime.
let ctrl = AtomicSwitchCtrl::new(drain);
let drain = ctrl.drain();
// Get a root logger that will log into a given drain.
//
// Note `o!` macro for more natural `OwnedKeyValue` sequence building.
let root = Logger::root(drain.fuse(), o!("version" => VERSION, "build-id" => "8dfljdf"));
// Build logging context as data becomes available.
//
// Create child loggers from existing ones. Children clone `key: value`
// pairs from their parents.
let log = root.new(o!("child" => 1));
// Closures can be used for values that change at runtime.
// Data captured by the closure needs to be `Send+Sync`.
let counter = Arc::new(AtomicUsize::new(0));
let log = log.new(o!("counter" => {
let counter = counter.clone();
// Note the `move` to capture `counter`,
// and unfortunate `|_ : &_|` that helps
// current `rustc` limitations. In the future,
// a `|_|` could work.
move |_ : &Record| { counter.load(SeqCst)}
}));
// Loggers can be cloned, passed between threads and stored without hassle.
let join = thread::spawn({
let log = log.clone();
move || {
info!(log, "before-fetch-add"); // counter == 0
counter.fetch_add(1, SeqCst);
info!(log, "after-fetch-add"); // counter == 1
// `AtomicSwitch` drain can swap it's interior atomically (race-free).
ctrl.set(
// drains are composable and reusable
level_filter(
Level::Info,
async_stream(
std::io::stderr(),
// multiple outputs formats are supported
slog_json::new(),
),
),
);
// Closures can be used for lazy evaluation:
// This `slow_fib` won't be evaluated, as the current drain discards
// "trace" level logging records.
debug!(log, "debug"; "lazy-closure" => |_ : &Record| slow_fib(40));
info!(log, "subthread"; "stage" => "start");
thread::sleep(Duration::new(1, 0));
info!(log, "subthread"; "stage" => "end");
}
});
join.join().unwrap();
}
See examples/features.rs for full code.
Read Documentation for details and features.
See faq for answers to common questions. If you want to say hi, or need help use #slog-rs gitter.im.
To report a bug or ask for features use github issues.
If you need to install Rust (come on, you should have done that long time ago!), use rustup.
In Cargo.toml:
[dependencies]
slog = "*"
In your main.rs:
#[macro_use]
extern crate slog;
Please fill an issue if slog does not fill your needs. I will appreciate any feedback. You might look into issue discussing slog-rs alternatives too.