solana_logger/
lib.rs

1//! The `logger` module configures `env_logger`
2
3use {
4    lazy_static::lazy_static,
5    std::sync::{Arc, RwLock},
6};
7
8lazy_static! {
9    static ref LOGGER: Arc<RwLock<env_logger::Logger>> =
10        Arc::new(RwLock::new(env_logger::Logger::from_default_env()));
11}
12
13struct LoggerShim {}
14
15impl log::Log for LoggerShim {
16    fn enabled(&self, metadata: &log::Metadata) -> bool {
17        LOGGER.read().unwrap().enabled(metadata)
18    }
19
20    fn log(&self, record: &log::Record) {
21        LOGGER.read().unwrap().log(record);
22    }
23
24    fn flush(&self) {}
25}
26
27fn replace_logger(logger: env_logger::Logger) {
28    log::set_max_level(logger.filter());
29    *LOGGER.write().unwrap() = logger;
30    let _ = log::set_boxed_logger(Box::new(LoggerShim {}));
31}
32
33// Configures logging with a specific filter overriding RUST_LOG.  _RUST_LOG is used instead
34// so if set it takes precedence.
35// May be called at any time to re-configure the log filter
36pub fn setup_with(filter: &str) {
37    let logger =
38        env_logger::Builder::from_env(env_logger::Env::new().filter_or("_RUST_LOG", filter))
39            .format_timestamp_nanos()
40            .build();
41    replace_logger(logger);
42}
43
44// Configures logging with a default filter if RUST_LOG is not set
45pub fn setup_with_default(filter: &str) {
46    let logger = env_logger::Builder::from_env(env_logger::Env::new().default_filter_or(filter))
47        .format_timestamp_nanos()
48        .build();
49    replace_logger(logger);
50}
51
52// Configures logging with the default filter "error" if RUST_LOG is not set
53pub fn setup() {
54    setup_with_default("error");
55}
56
57// Configures file logging with a default filter if RUST_LOG is not set
58//
59// NOTE: This does not work at the moment, pending the resolution of https://github.com/env-logger-rs/env_logger/issues/208
60pub fn setup_file_with_default(logfile: &str, filter: &str) {
61    use std::fs::OpenOptions;
62    let file = OpenOptions::new()
63        .write(true)
64        .create(true)
65        .append(true)
66        .open(logfile)
67        .unwrap();
68    let logger = env_logger::Builder::from_env(env_logger::Env::new().default_filter_or(filter))
69        .format_timestamp_nanos()
70        .target(env_logger::Target::Pipe(Box::new(file)))
71        .build();
72    replace_logger(logger);
73}