2014-12-13 21:49:39 +00:00
|
|
|
log
|
|
|
|
===
|
|
|
|
|
2015-01-25 06:44:46 +00:00
|
|
|
A Rust library providing a lightweight logging *facade*.
|
2014-12-13 21:49:39 +00:00
|
|
|
|
2015-09-22 00:01:43 +00:00
|
|
|
[![Build Status](https://travis-ci.org/rust-lang-nursery/log.svg?branch=master)](https://travis-ci.org/rust-lang-nursery/log)
|
2015-04-29 17:41:25 +00:00
|
|
|
[![Build status](https://ci.appveyor.com/api/projects/status/nopdjmmjt45xcrki?svg=true)](https://ci.appveyor.com/project/alexcrichton/log)
|
2014-12-13 21:49:39 +00:00
|
|
|
|
2017-08-13 23:54:53 +00:00
|
|
|
* [`log` documentation](https://docs.rs/log)
|
2014-12-13 21:49:39 +00:00
|
|
|
|
2015-01-25 06:44:46 +00:00
|
|
|
A logging facade provides a single logging API that abstracts over the actual
|
|
|
|
logging implementation. Libraries can use the logging API provided by this
|
|
|
|
crate, and the consumer of those libraries can choose the logging
|
|
|
|
implementation that is most suitable for its use case.
|
|
|
|
|
2014-12-13 21:49:39 +00:00
|
|
|
## Usage
|
|
|
|
|
2015-01-27 07:56:55 +00:00
|
|
|
## In libraries
|
|
|
|
|
|
|
|
Libraries should link only to the `log` crate, and use the provided macros to
|
|
|
|
log whatever information will be useful to downstream consumers:
|
2014-12-13 21:49:39 +00:00
|
|
|
|
|
|
|
```toml
|
|
|
|
[dependencies]
|
2015-03-28 14:20:31 +00:00
|
|
|
log = "0.3"
|
2014-12-13 21:49:39 +00:00
|
|
|
```
|
|
|
|
|
2015-01-27 07:56:55 +00:00
|
|
|
```rust
|
|
|
|
#[macro_use]
|
|
|
|
extern crate log;
|
|
|
|
|
|
|
|
pub fn shave_the_yak(yak: &Yak) {
|
|
|
|
trace!("Commencing yak shaving");
|
|
|
|
|
|
|
|
loop {
|
|
|
|
match find_a_razor() {
|
|
|
|
Ok(razor) => {
|
|
|
|
info!("Razor located: {}", razor);
|
|
|
|
yak.shave(razor);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
Err(err) => {
|
|
|
|
warn!("Unable to locate a razor: {}, retrying", err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
## In executables
|
|
|
|
|
2017-09-17 21:03:00 +00:00
|
|
|
In order to produce log output executables have to use a logger implementation compatible with the facade.
|
|
|
|
There are many available implementations to chose from, here are some of the most popular ones:
|
|
|
|
|
|
|
|
* Simple minimal loggers:
|
|
|
|
* [`env_logger`](https://docs.rs/env_logger/*/env_logger/)
|
|
|
|
* [`simple_logger`](https://github.com/borntyping/rust-simple_logger)
|
|
|
|
* [`simplelog`](https://github.com/drakulix/simplelog.rs)
|
|
|
|
* [`pretty_env_logger`](https://docs.rs/pretty_env_logger/*/pretty_env_logger/)
|
|
|
|
* [`stderrlog`](https://docs.rs/stderrlog/*/stderrlog/)
|
|
|
|
* [`flexi_logger`](https://docs.rs/flexi_logger/*/flexi_logger/)
|
|
|
|
* Complex configurable frameworks:
|
|
|
|
* [`log4rs`](https://docs.rs/log4rs/*/log4rs/)
|
|
|
|
* [`fern`](https://docs.rs/fern/*/fern/)
|
|
|
|
* Adaptors for other facilities:
|
|
|
|
* [`syslog`](https://docs.rs/syslog/*/syslog/)
|
|
|
|
* [`slog-stdlog`](https://docs.rs/slog-stdlog/*/slog_stdlog/)
|
|
|
|
|
2015-07-08 17:08:51 +00:00
|
|
|
Executables should choose a logger implementation and initialize it early in the
|
2015-01-27 07:56:55 +00:00
|
|
|
runtime of the program. Logger implementations will typically include a
|
|
|
|
function to do this. Any log messages generated before the logger is
|
|
|
|
initialized will be ignored.
|
|
|
|
|
|
|
|
The executable itself may use the `log` crate to log as well.
|