# log-once
[![Tests](https://github.com/Luthaf/log-once/actions/workflows/tests.yml/badge.svg?event=push)](https://github.com/Luthaf/log-once/actions/workflows/tests.yml)
[![Documentation](https://img.shields.io/badge/doc-docs.rs-green.svg)](https://docs.rs/log-once/)
[![Crates.io version](https://img.shields.io/crates/v/log-once.svg)](https://crates.io/crates/log-once)
Collection of helper macros for logging some events only once.
This crate provide macro in the `log_once` family (`warn_once!`,
`trace_once!`, ...); that only send a logging event once for every message.
It rely and uses the logging infrastructure in the [log][log] crate; and
is fully compatible with any logger implementation.
These macro will store the already seen messages in a `BTreeSet`, and check
if a message is in the set before sending the log event.
[log]: https://crates.io/crates/log
## Usage
1) Add it to your `Cargo.toml` file:
```toml
[dependencies]
log-once = "0.4"
```
2) import the macros:
```rust
use log_once::{warn_once, log_once};
```
3) Enjoy!
## Examples
```rust
use log::info;
use log_once::{info_once, warn_once};
pub fn shave_the_yak(yaks: &[Yak]) {
for yak in yaks {
info!(target: "yak_events", "Commencing yak shaving for {yak:?}");
loop {
match find_a_razor() {
Ok(razor) => {
// This will only appear once in the logger output for each razor
info_once!("Razor located: {razor}");
yak.shave(razor);
break;
}
Err(err) => {
// This will only appear once in the logger output for each error
warn_once!("Unable to locate a razor: {err}, retrying");
}
}
}
}
}
```
## License
log-once is distributed under the terms of both the MIT license and the
Apache License (Version 2.0).
See [LICENSE-APACHE](LICENSE-APACHE) and [LICENSE-MIT](LICENSE-MIT) for details.