1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
use log_specification::LogSpecification;
use primary_writer::PrimaryWriter;
use std::borrow::Borrow;
use std::sync::Arc;
use std::sync::RwLock;
/// Allows reconfiguring the logger while it is in use
/// (see [`Logger::start_reconfigurable()`](struct.Logger.html#method.start_reconfigurable) ).
///
/// # Example
///
/// Use the reconfigurability feature and build the log spec programmatically.
///
/// ```rust
/// extern crate log;
/// extern crate flexi_logger;
/// use flexi_logger::{Logger, LogSpecBuilder};
/// use log::LevelFilter;
///
/// fn main() {
/// // Build the initial log specification
/// let mut builder = LogSpecBuilder::new(); // default is LevelFilter::Off
/// builder.default(LevelFilter::Info);
/// builder.module("karl", LevelFilter::Debug);
///
/// // Initialize Logger, keep builder alive
/// let mut logger_reconf_handle = Logger::with(builder.build())
/// // your logger configuration goes here, as usual
/// .start_reconfigurable()
/// .unwrap_or_else(|e| panic!("Logger initialization failed with {}", e));
///
/// // ...
///
/// // Modify builder and update the logger
/// builder.default(LevelFilter::Error);
/// builder.remove("karl");
/// builder.module("emma", LevelFilter::Trace);
///
/// logger_reconf_handle.set_new_spec(builder.build());
///
/// // ...
/// }
/// ```
pub struct ReconfigurationHandle {
spec: Arc<RwLock<LogSpecification>>,
primary_writer: Arc<PrimaryWriter>,
}
impl ReconfigurationHandle {
/// Allows specifying a new LogSpecification for the current logger.
pub fn set_new_spec(&mut self, new_spec: LogSpecification) {
let mut guard = self.spec.write().unwrap(/* not sure if we should expose this */);
guard.reconfigure(new_spec);
}
/// Allows specifying a new LogSpecification for the current logger.
pub fn parse_new_spec(&mut self, spec: &str) {
let mut guard = self.spec.write().unwrap(/* not sure if we should expose this */);
guard
.reconfigure(LogSpecification::parse(spec).unwrap_or_else(|_| LogSpecification::off()));
}
#[doc(hidden)]
/// Allows checking the logs written so far to the writer
pub fn validate_logs(&self, expected: &[(&'static str, &'static str, &'static str)]) -> bool {
Borrow::<PrimaryWriter>::borrow(&self.primary_writer).validate_logs(expected)
}
}
pub fn reconfiguration_handle(
spec: Arc<RwLock<LogSpecification>>,
primary_writer: Arc<PrimaryWriter>,
) -> ReconfigurationHandle {
ReconfigurationHandle {
spec,
primary_writer,
}
}