Skip to content

Commit 9997ba5

Browse files
mitsuhikojan-auer
authored andcommitted
feat: Added env_logger integration (#48)
1 parent d597f87 commit 9997ba5

File tree

6 files changed

+92
-8
lines changed

6 files changed

+92
-8
lines changed

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ build = "build.rs"
1616
all-features = true
1717

1818
[features]
19-
default = ["with_client_implementation", "with_panic", "with_failure", "with_log", "with_device_info", "with_rust_info"]
19+
default = ["with_client_implementation", "with_panic", "with_failure", "with_log", "with_env_logger", "with_device_info", "with_rust_info"]
2020
with_client_implementation = ["reqwest", "im", "url", "with_backtrace"]
2121
with_backtrace = ["backtrace", "regex"]
2222
with_panic = ["with_backtrace"]
2323
with_failure = ["failure", "with_backtrace"]
2424
with_log = ["log", "with_backtrace"]
25+
with_env_logger = ["with_log", "env_logger"]
2526
with_error_chain = ["error-chain", "with_backtrace"]
2627
with_device_info = ["libc", "hostname", "uname", "with_client_implementation"]
2728
with_rust_info = ["rustc_version", "with_client_implementation"]
@@ -36,6 +37,7 @@ log = { version = "0.4.1", optional = true }
3637
serde = "1.0.66"
3738
serde_json = "1.0.19"
3839
sentry-types = "0.5.3"
40+
env_logger = { version = "0.5.10", optional = true }
3941
reqwest = { version = "0.8.6", optional = true }
4042
uuid = { version = "0.6.5", features = ["v4"] }
4143
lazy_static = "1.0.1"

examples/log-demo.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fn main() {
1515

1616
let mut log_builder = pretty_env_logger::formatted_builder().unwrap();
1717
log_builder.parse("info");
18-
sentry::integrations::log::init(Some(Box::new(log_builder.build())), Default::default());
18+
sentry::integrations::env_logger::init(Some(log_builder.build()), Default::default());
1919
sentry::integrations::panic::register_panic_handler();
2020

2121
info!("System is booting");

src/integrations/env_logger.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
//! Adds support for automatic breadcrumb capturing from logs with `env_logger`.
2+
//!
3+
//! **Feature:** `with_env_logger` (*enabled by default*)
4+
//!
5+
//! # Configuration
6+
//!
7+
//! In the most trivial version you call this crate's init function instead of the one
8+
//! from `env_logger` and pass `None` as logger:
9+
//!
10+
//! ```no_run
11+
//! # extern crate sentry;
12+
//! sentry::integrations::env_logger::init(None, Default::default());
13+
//! ```
14+
//!
15+
//! This parses the default `RUST_LOG` environment variable and configures both `env_logger`
16+
//! and this crate appropriately. If you want to create your own logger you can forward it
17+
//! accordingly:
18+
//!
19+
//! ```no_run
20+
//! # extern crate sentry;
21+
//! # extern crate pretty_env_logger;
22+
//! let mut log_builder = pretty_env_logger::formatted_builder().unwrap();
23+
//! log_builder.parse("info,foo=debug");
24+
//! sentry::integrations::env_logger::init(Some(log_builder.build()), Default::default());
25+
//! ```
26+
use env_logger;
27+
28+
use integrations::log::{self as sentry_log, LoggerOptions};
29+
30+
/// Initializes the environment logger.
31+
///
32+
/// If a logger is given then it is used, otherwise a new logger is created in the same
33+
/// way as `env_logger::init` does normally. The `global_filter` on the options is set
34+
/// to the filter of the logger.
35+
pub fn init(logger: Option<env_logger::Logger>, mut options: LoggerOptions) {
36+
let logger =
37+
logger.unwrap_or_else(|| env_logger::Builder::from_env(env_logger::Env::default()).build());
38+
let filter = logger.filter();
39+
if options.global_filter.is_none() {
40+
options.global_filter = Some(filter);
41+
}
42+
sentry_log::init(Some(Box::new(logger)), options);
43+
}

src/integrations/log.rs

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,17 @@
1818
//! # extern crate pretty_env_logger;
1919
//! let mut log_builder = pretty_env_logger::formatted_builder().unwrap();
2020
//! log_builder.parse("info"); // or env::var("RUST_LOG")
21-
//! sentry::integrations::log::init(Some(
22-
//! Box::new(log_builder.build())), Default::default());
21+
//! let logger = log_builder.build();
22+
//! let options = sentry::integrations::log::LoggerOptions {
23+
//! global_filter: Some(logger.filter()),
24+
//! ..Default::default()
25+
//! };
26+
//! sentry::integrations::log::init(Some(Box::new(logger)), options);
2327
//! ```
28+
//!
29+
//! For loggers based on `env_logger` (like `pretty_env_logger`) you can also
30+
//! use the [`env_logger`](../env_logger/index.html) integration which is
31+
//! much easier to use.
2432
use log;
2533

2634
use api::add_breadcrumb;
@@ -52,6 +60,25 @@ impl Default for LoggerOptions {
5260
}
5361
}
5462

63+
impl LoggerOptions {
64+
/// Returns the effective global filter.
65+
///
66+
/// This is what is set for these logger options when the log level
67+
/// needs to be set globally. This is the greater of `global_filter`
68+
/// and `filter`.
69+
fn effective_global_filter(&self) -> log::LevelFilter {
70+
if let Some(filter) = self.global_filter {
71+
if filter < self.filter {
72+
self.filter
73+
} else {
74+
filter
75+
}
76+
} else {
77+
self.filter
78+
}
79+
}
80+
}
81+
5582
/// Provides a dispatching logger.
5683
pub struct Logger {
5784
dest: Option<Box<log::Log>>,
@@ -170,14 +197,20 @@ fn convert_log_level(level: log::Level) -> Level {
170197
/// use env_logger;
171198
///
172199
/// let builder = env_logger::Builder::from_default_env();
173-
/// log::init(Some(Box::new(builder.build())), Default::default());
200+
/// let logger = builder.build();
201+
/// log::init(Some(Box::new(builder.build())), LoggerOptions {
202+
/// global_filter: Some(logger.filter()),
203+
/// ..Default::default()
204+
/// });
174205
/// ```
206+
///
207+
/// (For using `env_logger` you can also use the `env_logger` integration
208+
/// which simplifies this).
175209
pub fn init(dest: Option<Box<log::Log>>, options: LoggerOptions) {
176210
let logger = Logger::new(dest, options);
177-
if let Some(filter) = logger.options().global_filter {
211+
let filter = logger.options().effective_global_filter();
212+
if filter > log::max_level() {
178213
log::set_max_level(filter);
179-
} else {
180-
log::set_max_level(logger.options().filter);
181214
}
182215
log::set_boxed_logger(Box::new(logger)).unwrap();
183216
}

src/integrations/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,8 @@ pub mod error_chain;
1010
#[cfg(feature = "with_log")]
1111
pub mod log;
1212

13+
#[cfg(feature = "with_env_logger")]
14+
pub mod env_logger;
15+
1316
#[cfg(feature = "with_panic")]
1417
pub mod panic;

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ extern crate error_chain;
135135
#[cfg(feature = "with_log")]
136136
extern crate log;
137137

138+
#[cfg(feature = "with_env_logger")]
139+
extern crate env_logger;
140+
138141
#[cfg(feature = "with_debug_meta")]
139142
extern crate findshlibs;
140143

0 commit comments

Comments
 (0)