Skip to content

Commit fe0f547

Browse files
committed
feat(facade): forward logs to log facade
- modify tests to forward logs to mock in-memory `log` logger - correct "Forwards" spelling error
1 parent 6d8c65e commit fe0f547

File tree

8 files changed

+158
-27
lines changed

8 files changed

+158
-27
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ libc = "0.2"
8080
uniffi = { version = "0.27.3", features = ["build"], optional = true }
8181
serde = { version = "1.0.210", default-features = false, features = ["std", "derive"] }
8282
serde_json = { version = "1.0.128", default-features = false, features = ["std"] }
83+
log = { version = "0.4.22", features = ["std"]}
8384

8485
vss-client = "0.3"
8586
prost = { version = "0.11.6", default-features = false}

bindings/ldk_node.udl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ dictionary FilesystemLoggerConfig {
3939
LdkLevel level;
4040
};
4141

42+
dictionary LogFacadeLoggerConfig {
43+
LdkLevel level;
44+
};
45+
4246
interface Builder {
4347
constructor();
4448
[Name=from_config]
@@ -54,6 +58,7 @@ interface Builder {
5458
void set_liquidity_source_lsps2(SocketAddress address, PublicKey node_id, string? token);
5559
void set_storage_dir_path(string storage_dir_path);
5660
void set_filesystem_logger(FilesystemLoggerConfig fs_config);
61+
void set_log_facade_logger(LogFacadeLoggerConfig lf_config);
5762
void set_network(Network network);
5863
[Throws=BuildError]
5964
void set_listening_addresses(sequence<SocketAddress> listening_addresses);

src/builder.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77

88
use crate::chain::{ChainSource, DEFAULT_ESPLORA_SERVER_URL};
99
use crate::config::{
10-
default_user_config, Config, EsploraSyncConfig, FilesystemLoggerConfig, WALLET_KEYS_SEED_LEN,
10+
default_user_config, Config, EsploraSyncConfig, FilesystemLoggerConfig, LogFacadeLoggerConfig,
11+
WALLET_KEYS_SEED_LEN,
1112
};
1213

1314
use crate::connection::ConnectionManager;
@@ -111,6 +112,7 @@ impl Default for LiquiditySourceConfig {
111112
#[derive(Debug)]
112113
enum LogWriterConfig {
113114
File(FilesystemLoggerConfig),
115+
Log(LogFacadeLoggerConfig),
114116
}
115117

116118
impl Default for LogWriterConfig {
@@ -320,6 +322,12 @@ impl NodeBuilder {
320322
self
321323
}
322324

325+
/// Configures the [`Node`] instance to write logs to the `log` facade.
326+
pub fn set_log_facade_logger(&mut self, lf_config: LogFacadeLoggerConfig) -> &mut Self {
327+
self.log_writer_config = Some(LogWriterConfig::Log(lf_config));
328+
self
329+
}
330+
323331
/// Sets the Bitcoin network used.
324332
pub fn set_network(&mut self, network: Network) -> &mut Self {
325333
self.config.network = network;
@@ -635,6 +643,11 @@ impl ArcedNodeBuilder {
635643
self.inner.write().unwrap().set_filesystem_logger(fs_config);
636644
}
637645

646+
/// Configures the [`Node`] instance to write logs to the `log` facade.
647+
pub fn set_log_facade_logger(&self, lf_config: LogFacadeLoggerConfig) {
648+
self.inner.write().unwrap().set_log_facade_logger(lf_config);
649+
}
650+
638651
/// Sets the Bitcoin network used.
639652
pub fn set_network(&self, network: Network) {
640653
self.inner.write().unwrap().set_network(network);
@@ -1268,6 +1281,10 @@ fn setup_logger(config: &LogWriterConfig) -> Result<Arc<Logger>, BuildError> {
12681281
.map_err(|_| BuildError::LoggerSetupFailed)?,
12691282
))
12701283
},
1284+
LogWriterConfig::Log(log_facade_logger_config) => Ok(Arc::new(
1285+
Logger::new_log_facade(log_facade_logger_config.level)
1286+
.map_err(|_| BuildError::LoggerSetupFailed)?,
1287+
)),
12711288
}
12721289
}
12731290

src/config.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ impl From<MaxDustHTLCExposure> for LdkMaxDustHTLCExposure {
430430
}
431431

432432
/// Configuration options for logging to the filesystem.
433-
#[derive(Debug)]
433+
#[derive(Debug, Clone)]
434434
pub struct FilesystemLoggerConfig {
435435
/// The log file path.
436436
///
@@ -441,6 +441,13 @@ pub struct FilesystemLoggerConfig {
441441
pub level: LdkLevel,
442442
}
443443

444+
/// Configuration options for logging to the `log` facade.
445+
#[derive(Debug, Clone)]
446+
pub struct LogFacadeLoggerConfig {
447+
/// This specifies the log level.
448+
pub level: LdkLevel,
449+
}
450+
444451
impl Default for FilesystemLoggerConfig {
445452
fn default() -> Self {
446453
let log_file_path = format!("{}/{}", DEFAULT_STORAGE_DIR_PATH, DEFAULT_LOG_FILE_PATH);

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ pub use event::Event;
111111

112112
pub use io::utils::generate_entropy_mnemonic;
113113

114-
pub use config::FilesystemLoggerConfig;
114+
pub use config::{FilesystemLoggerConfig, LogFacadeLoggerConfig};
115115
pub use logger::{LdkLevel, LogRecord, LogWriter};
116116

117117
#[cfg(feature = "uniffi")]

src/logger.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub(crate) use lightning::{log_bytes, log_debug, log_error, log_info, log_trace}
1111
pub use lightning::util::logger::Level as LdkLevel;
1212

1313
use chrono::Utc;
14+
use log::{debug, error, info, trace, warn};
1415

1516
use std::fs;
1617
use std::io::Write;
@@ -52,10 +53,16 @@ pub(crate) struct FilesystemLogger {
5253
level: LdkLevel,
5354
}
5455

56+
pub(crate) struct LogFacadeLogger {
57+
level: LdkLevel,
58+
}
59+
5560
/// Defines a writer for [`Logger`].
5661
pub(crate) enum Writer {
5762
/// Writes logs to the file system.
5863
FileWriter(FilesystemLogger),
64+
/// Forwards logs to the `log` facade.
65+
LogFacadeWriter(LogFacadeLogger),
5966
}
6067

6168
impl LogWriter for Writer {
@@ -84,6 +91,14 @@ impl LogWriter for Writer {
8491
.write_all(log.as_bytes())
8592
.expect("Failed to write to log file")
8693
},
94+
Writer::LogFacadeWriter(log_facade_logger) => match log_facade_logger.level {
95+
LdkLevel::Gossip => trace!("{}", log),
96+
LdkLevel::Trace => trace!("{}", log),
97+
LdkLevel::Debug => debug!("{}", log),
98+
LdkLevel::Info => info!("{}", log),
99+
LdkLevel::Warn => warn!("{}", log),
100+
LdkLevel::Error => error!("{}", log),
101+
},
87102
}
88103
}
89104
}
@@ -113,6 +128,12 @@ impl Logger {
113128

114129
Ok(Self { writer: Writer::FileWriter(fs_writer) })
115130
}
131+
132+
pub fn new_log_facade(level: LdkLevel) -> Result<Self, ()> {
133+
let log_facade_writer = LogFacadeLogger { level };
134+
135+
Ok(Self { writer: Writer::LogFacadeWriter(log_facade_writer) })
136+
}
116137
}
117138

118139
impl LdkLogger for Logger {

tests/common/mod.rs

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ use ldk_node::config::{Config, EsploraSyncConfig};
1212
use ldk_node::io::sqlite_store::SqliteStore;
1313
use ldk_node::payment::{PaymentDirection, PaymentKind, PaymentStatus};
1414
use ldk_node::{
15-
Builder, CustomTlvRecord, Event, LightningBalance, Node, NodeError, PendingSweepBalance,
15+
Builder, CustomTlvRecord, Event, FilesystemLoggerConfig, LightningBalance,
16+
LogFacadeLoggerConfig, Node, NodeError, PendingSweepBalance,
1617
};
1718

1819
use lightning::ln::msgs::SocketAddress;
@@ -39,9 +40,11 @@ use electrum_client::ElectrumApi;
3940
use rand::distributions::Alphanumeric;
4041
use rand::{thread_rng, Rng};
4142

43+
use log::{LevelFilter, Log};
44+
4245
use std::env;
4346
use std::path::PathBuf;
44-
use std::sync::{Arc, RwLock};
47+
use std::sync::{Arc, Mutex, RwLock};
4548
use std::time::Duration;
4649

4750
macro_rules! expect_event {
@@ -250,6 +253,47 @@ pub(crate) enum TestChainSource<'a> {
250253
BitcoindRpc(&'a BitcoinD),
251254
}
252255

256+
#[derive(Clone)]
257+
pub(crate) enum TestLogWriter {
258+
File(FilesystemLoggerConfig),
259+
LogFacade(LogFacadeLoggerConfig),
260+
}
261+
262+
/// Simple in-memory mock `log` logger for tests.
263+
pub(crate) struct MockLogger {
264+
logs: Arc<Mutex<Vec<String>>>,
265+
}
266+
267+
impl MockLogger {
268+
pub fn new() -> Self {
269+
Self { logs: Arc::new(Mutex::new(Vec::new())) }
270+
}
271+
272+
pub fn retrieve_logs(&self) -> Vec<String> {
273+
self.logs.lock().unwrap().clone()
274+
}
275+
}
276+
277+
impl Log for MockLogger {
278+
fn log(&self, record: &log::Record) {
279+
let message = format!("[{}] {}", record.level(), record.args());
280+
self.logs.lock().unwrap().push(message);
281+
}
282+
283+
fn enabled(&self, _metadata: &log::Metadata) -> bool {
284+
true
285+
}
286+
287+
fn flush(&self) {}
288+
}
289+
290+
pub(crate) fn init_mock_logger(level: LevelFilter) -> Arc<MockLogger> {
291+
let logger = Arc::new(MockLogger::new());
292+
log::set_boxed_logger(Box::new(logger.clone())).unwrap();
293+
log::set_max_level(level);
294+
logger
295+
}
296+
253297
macro_rules! setup_builder {
254298
($builder: ident, $config: expr) => {
255299
#[cfg(feature = "uniffi")]
@@ -263,11 +307,11 @@ pub(crate) use setup_builder;
263307

264308
pub(crate) fn setup_two_nodes(
265309
chain_source: &TestChainSource, allow_0conf: bool, anchor_channels: bool,
266-
anchors_trusted_no_reserve: bool,
310+
anchors_trusted_no_reserve: bool, log_writer: TestLogWriter,
267311
) -> (TestNode, TestNode) {
268312
println!("== Node A ==");
269313
let config_a = random_config(anchor_channels);
270-
let node_a = setup_node(chain_source, config_a, None);
314+
let node_a = setup_node(chain_source, config_a, None, log_writer.clone());
271315

272316
println!("\n== Node B ==");
273317
let mut config_b = random_config(anchor_channels);
@@ -282,12 +326,13 @@ pub(crate) fn setup_two_nodes(
282326
.trusted_peers_no_reserve
283327
.push(node_a.node_id());
284328
}
285-
let node_b = setup_node(chain_source, config_b, None);
329+
let node_b = setup_node(chain_source, config_b, None, log_writer);
286330
(node_a, node_b)
287331
}
288332

289333
pub(crate) fn setup_node(
290334
chain_source: &TestChainSource, config: Config, seed_bytes: Option<Vec<u8>>,
335+
log_writer: TestLogWriter,
291336
) -> TestNode {
292337
setup_builder!(builder, config);
293338
match chain_source {
@@ -308,6 +353,15 @@ pub(crate) fn setup_node(
308353
},
309354
}
310355

356+
match log_writer {
357+
TestLogWriter::File(fs_config) => {
358+
builder.set_filesystem_logger(fs_config);
359+
},
360+
TestLogWriter::LogFacade(lf_config) => {
361+
builder.set_log_facade_logger(lf_config);
362+
},
363+
}
364+
311365
if let Some(seed) = seed_bytes {
312366
builder.set_entropy_seed_bytes(seed).unwrap();
313367
}

0 commit comments

Comments
 (0)