blob: fdfd2452c31610196aa081e3361b67d5bf445641 [file] [log] [blame]
use bt_common::init_flags;
use log::LevelFilter;
use syslog::{BasicLogger, Facility, Formatter3164};
/// API to modify log levels.
pub trait IBluetoothLogging {
/// Check whether debug logging is enabled.
fn is_debug_enabled(&self) -> bool;
/// Change whether debug logging is enabled.
fn set_debug_logging(&mut self, enabled: bool);
}
/// Logging related implementation.
pub struct BluetoothLogging {
is_debug: bool,
}
impl BluetoothLogging {
pub fn new(is_debug: bool, log_output: &str) -> Self {
let level = if is_debug { LevelFilter::Debug } else { LevelFilter::Info };
if log_output == "stderr" {
env_logger::Builder::new().filter(None, level).init();
} else {
let formatter = Formatter3164 {
facility: Facility::LOG_USER,
hostname: None,
process: "btadapterd".into(),
pid: 0,
};
let logger = syslog::unix(formatter).expect("could not connect to syslog");
let _ = log::set_boxed_logger(Box::new(BasicLogger::new(logger)))
.map(|()| log::set_max_level(level));
}
Self { is_debug }
}
}
impl IBluetoothLogging for BluetoothLogging {
fn is_debug_enabled(&self) -> bool {
self.is_debug
}
fn set_debug_logging(&mut self, enabled: bool) {
self.is_debug = enabled;
// Update log level in Linux stack.
let level = if self.is_debug { LevelFilter::Debug } else { LevelFilter::Info };
log::set_max_level(level);
// Update log level in libbluetooth.
let level =
if self.is_debug { init_flags::LOG_TAG_DEBUG } else { init_flags::LOG_TAG_INFO };
init_flags::update_default_log_level(level);
// Mark the start of debug logging with a debug print.
if self.is_debug {
log::debug!("Debug logging successfully enabled!");
}
log::info!("Setting debug logging to {}", self.is_debug);
}
}