Files
breez-sdk-liquid/lib/core/src/logger.rs
ok300 7276346a5f Cleanup, fix typos (#299)
* Fix typo in PaymentSucceeded event name

* Remove fixed todo

* Organize imports

* Fix log typos

* Re-generate flutter bindings

* Re-generate RN bindings

* Fix "Unhandled msg" logs for WS pings

* Hide ureq debug logs, showing raw HTTP headers for Boltz calls
2024-06-07 04:53:14 +00:00

87 lines
2.4 KiB
Rust

use std::fs::OpenOptions;
use std::io::Write;
use anyhow::{anyhow, Result};
use chrono::Local;
use log::{LevelFilter, Metadata, Record};
use crate::model::LogEntry;
pub(crate) struct GlobalSdkLogger {
/// SDK internal logger, which logs to file
pub(crate) logger: env_logger::Logger,
/// Optional external log listener, that can receive a stream of log statements
pub(crate) log_listener: Option<Box<dyn log::Log>>,
}
impl log::Log for GlobalSdkLogger {
fn enabled(&self, metadata: &Metadata) -> bool {
metadata.level() <= log::Level::Trace
}
fn log(&self, record: &Record) {
if self.enabled(record.metadata()) {
self.logger.log(record);
if let Some(s) = &self.log_listener.as_ref() {
if s.enabled(record.metadata()) {
s.log(record);
}
}
}
}
fn flush(&self) {}
}
pub(super) fn init_logging(log_dir: &str, app_logger: Option<Box<dyn log::Log>>) -> Result<()> {
let target_log_file = Box::new(
OpenOptions::new()
.create(true)
.append(true)
.open(format!("{log_dir}/sdk.log"))
.map_err(|e| anyhow!("Can't create log file: {e}"))?,
);
let logger = env_logger::Builder::new()
.target(env_logger::Target::Pipe(target_log_file))
.parse_filters(
r#"
debug,
breez_liquid_sdk=debug,
breez_liquid_sdk::swapper::boltz_status_stream=info,
electrum_client::raw_client=warn,
lwk_wollet=info,
rustls=warn,
rustyline=warn,
ureq=info,
tungstenite=warn
"#,
)
.format(|buf, record| {
writeln!(
buf,
"[{} {} {}:{}] {}",
Local::now().format("%Y-%m-%d %H:%M:%S%.3f"),
record.level(),
record.module_path().unwrap_or("unknown"),
record.line().unwrap_or(0),
record.args()
)
})
.build();
let global_logger = GlobalSdkLogger {
logger,
log_listener: app_logger,
};
log::set_boxed_logger(Box::new(global_logger))
.map_err(|e| anyhow!("Failed to set global logger: {e}"))?;
log::set_max_level(LevelFilter::Trace);
Ok(())
}
pub trait Logger: Send + Sync {
fn log(&self, l: LogEntry);
}