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)
|
|
|
|
* [`env_logger` documentation](https://docs.rs/env_logger)
|
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
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
The `env_logger` crate provides a logger implementation that mirrors the
|
|
|
|
functionality of the old revision of the `log` crate.
|
|
|
|
|
|
|
|
```toml
|
|
|
|
[dependencies]
|
2015-03-28 14:20:31 +00:00
|
|
|
log = "0.3"
|
|
|
|
env_logger = "0.3"
|
2015-01-27 07:56:55 +00:00
|
|
|
```
|
2014-12-13 21:49:39 +00:00
|
|
|
|
|
|
|
```rust
|
2015-01-25 06:44:46 +00:00
|
|
|
#[macro_use]
|
2014-12-13 21:49:39 +00:00
|
|
|
extern crate log;
|
2015-01-27 07:56:55 +00:00
|
|
|
extern crate env_logger;
|
|
|
|
|
|
|
|
fn main() {
|
2017-06-14 16:26:09 +00:00
|
|
|
env_logger::init();
|
2015-01-27 07:56:55 +00:00
|
|
|
|
|
|
|
info!("starting up");
|
|
|
|
|
|
|
|
// ...
|
|
|
|
}
|
2014-12-13 21:49:39 +00:00
|
|
|
```
|
2015-09-13 23:04:07 +00:00
|
|
|
|
2015-09-13 22:18:40 +00:00
|
|
|
Then when running the executable, specify a value for the `RUST_LOG`
|
|
|
|
environment variable that corresponds with the log messages you want to show.
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ RUST_LOG=info ./main
|
|
|
|
starting up
|
|
|
|
```
|
|
|
|
|
2017-05-24 01:39:28 +00:00
|
|
|
See the [`env_logger` documentation](http://rust-lang-nursery.github.io/log/env_logger/)
|
2015-09-13 22:18:40 +00:00
|
|
|
for the `RUST_LOG` values that can be used to get log messages with different
|
|
|
|
levels or filtered to different modules.
|
2017-05-24 01:39:28 +00:00
|
|
|
|
2015-09-13 23:04:07 +00:00
|
|
|
## In tests
|
|
|
|
|
|
|
|
Tests can use the `env_logger` crate to see log messages generated during that test:
|
|
|
|
|
|
|
|
```toml
|
|
|
|
[dependencies]
|
|
|
|
log = "0.3"
|
|
|
|
|
|
|
|
[dev-dependencies]
|
|
|
|
env_logger = "0.3"
|
|
|
|
```
|
|
|
|
|
|
|
|
```rust
|
|
|
|
#[macro_use]
|
|
|
|
extern crate log;
|
|
|
|
|
|
|
|
fn add_one(num: i32) -> i32 {
|
|
|
|
info!("add_one called with {}", num);
|
|
|
|
num + 1
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use super::*;
|
|
|
|
extern crate env_logger;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn it_adds_one() {
|
2015-09-20 15:05:36 +00:00
|
|
|
let _ = env_logger::init();
|
2015-09-13 23:04:07 +00:00
|
|
|
info!("can log from the test too");
|
|
|
|
assert_eq!(3, add_one(2));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn it_handles_negative_numbers() {
|
2015-09-20 15:05:36 +00:00
|
|
|
let _ = env_logger::init();
|
|
|
|
info!("logging from another test");
|
|
|
|
assert_eq!(-7, add_one(-8));
|
2015-09-13 23:04:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Assuming the module under test is called `my_lib`, running the tests with the
|
|
|
|
`RUST_LOG` filtering to info messages from this module looks like:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ RUST_LOG=my_lib=info cargo test
|
|
|
|
Running target/debug/my_lib-...
|
|
|
|
|
|
|
|
running 2 tests
|
2015-09-20 15:05:36 +00:00
|
|
|
INFO:my_lib::tests: logging from another test
|
|
|
|
INFO:my_lib: add_one called with -8
|
2015-09-13 23:04:07 +00:00
|
|
|
test tests::it_handles_negative_numbers ... ok
|
|
|
|
INFO:my_lib::tests: can log from the test too
|
|
|
|
INFO:my_lib: add_one called with 2
|
|
|
|
test tests::it_adds_one ... ok
|
|
|
|
|
|
|
|
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured
|
|
|
|
```
|
|
|
|
|
2015-09-20 15:05:36 +00:00
|
|
|
Note that `env_logger::init()` needs to be called in each test in which you
|
|
|
|
want to enable logging. Additionally, the default behavior of tests to
|
2015-09-13 23:04:07 +00:00
|
|
|
run in parallel means that logging output may be interleaved with test output.
|
|
|
|
Either run tests in a single thread by specifying `RUST_TEST_THREADS=1` or by
|
|
|
|
running one test by specifying its name as an argument to the test binaries as
|
|
|
|
directed by the `cargo test` help docs:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ RUST_LOG=my_lib=info cargo test it_adds_one
|
|
|
|
Running target/debug/my_lib-...
|
|
|
|
|
|
|
|
running 1 test
|
|
|
|
INFO:my_lib::tests: can log from the test too
|
|
|
|
INFO:my_lib: add_one called with 2
|
|
|
|
test tests::it_adds_one ... ok
|
|
|
|
|
|
|
|
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
|
|
|
|
```
|
2017-03-29 12:52:27 +00:00
|
|
|
|
|
|
|
## Configuring log target
|
|
|
|
|
|
|
|
By default, `env_logger` logs to stderr. If you want to log to stdout instead,
|
2017-05-24 16:52:02 +00:00
|
|
|
you can use the `Builder` to change the log target:
|
2017-03-29 12:52:27 +00:00
|
|
|
|
|
|
|
```rust
|
|
|
|
use std::env;
|
2017-05-24 16:52:02 +00:00
|
|
|
use env_logger::{Builder, Target};
|
2017-03-29 12:52:27 +00:00
|
|
|
|
2017-05-24 16:52:02 +00:00
|
|
|
let mut builder = Builder::new();
|
|
|
|
builder.target(Target::Stdout);
|
2017-03-29 12:52:27 +00:00
|
|
|
if env::var("RUST_LOG").is_ok() {
|
|
|
|
builder.parse(&env::var("RUST_LOG").unwrap());
|
|
|
|
}
|
2017-06-14 16:26:09 +00:00
|
|
|
builder.init();
|
2017-03-29 12:52:27 +00:00
|
|
|
```
|