• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use bt_common::init_flags;
2 use log::LevelFilter;
3 use syslog::{BasicLogger, Facility, Formatter3164};
4 
5 /// API to modify log levels.
6 pub trait IBluetoothLogging {
7     /// Check whether debug logging is enabled.
is_debug_enabled(&self) -> bool8     fn is_debug_enabled(&self) -> bool;
9 
10     /// Change whether debug logging is enabled.
set_debug_logging(&mut self, enabled: bool)11     fn set_debug_logging(&mut self, enabled: bool);
12 }
13 
14 /// Logging related implementation.
15 pub struct BluetoothLogging {
16     is_debug: bool,
17 }
18 
19 impl BluetoothLogging {
new(is_debug: bool, log_output: &str) -> Self20     pub fn new(is_debug: bool, log_output: &str) -> Self {
21         let level = if is_debug { LevelFilter::Debug } else { LevelFilter::Info };
22 
23         if log_output == "stderr" {
24             env_logger::Builder::new().filter(None, level).init();
25         } else {
26             let formatter = Formatter3164 {
27                 facility: Facility::LOG_USER,
28                 hostname: None,
29                 process: "btadapterd".into(),
30                 pid: 0,
31             };
32 
33             let logger = syslog::unix(formatter).expect("could not connect to syslog");
34             let _ = log::set_boxed_logger(Box::new(BasicLogger::new(logger)))
35                 .map(|()| log::set_max_level(level));
36         }
37 
38         Self { is_debug }
39     }
40 }
41 
42 impl IBluetoothLogging for BluetoothLogging {
is_debug_enabled(&self) -> bool43     fn is_debug_enabled(&self) -> bool {
44         self.is_debug
45     }
46 
set_debug_logging(&mut self, enabled: bool)47     fn set_debug_logging(&mut self, enabled: bool) {
48         self.is_debug = enabled;
49 
50         // Update log level in Linux stack.
51         let level = if self.is_debug { LevelFilter::Debug } else { LevelFilter::Info };
52         log::set_max_level(level);
53 
54         // Update log level in libbluetooth.
55         let level =
56             if self.is_debug { init_flags::LOG_TAG_DEBUG } else { init_flags::LOG_TAG_INFO };
57         init_flags::update_default_log_level(level);
58 
59         // Mark the start of debug logging with a debug print.
60         if self.is_debug {
61             log::debug!("Debug logging successfully enabled!");
62         }
63 
64         log::info!("Setting debug logging to {}", self.is_debug);
65     }
66 }
67