Skip to content

Commit fe6c361

Browse files
committed
refactor: simplify log-related code and improve clarity
This commit includes several improvements aimed at simplifying code, improving readability, and optimizing performance: - Inline enum struct fields to reduce indirection and clutter. - Rename structs to improve clarity and better reflect their purpose. - Enable specific feature flags in dependencies for a more streamlined build. - Eliminate unnecessary data allocations to optimize memory usage. - Correct minor grammatical error in documentation.
1 parent d8eb0e1 commit fe6c361

File tree

8 files changed

+88
-86
lines changed

8 files changed

+88
-86
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ libc = "0.2"
7575
uniffi = { version = "0.27.3", features = ["build"], optional = true }
7676
serde = { version = "1.0.210", default-features = false, features = ["std", "derive"] }
7777
serde_json = { version = "1.0.128", default-features = false, features = ["std"] }
78-
log = { version = "0.4.22", features = ["std"]}
78+
log = { version = "0.4.22", default-features = false, features = ["std"]}
7979

8080
vss-client = "0.3"
8181
prost = { version = "0.11.6", default-features = false}

bindings/ldk_node.udl

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,8 @@ enum LogLevel {
3535
};
3636

3737
dictionary FilesystemLoggerConfig {
38-
string log_file_path;
39-
LogLevel level;
40-
};
41-
42-
dictionary LogFacadeLoggerConfig {
43-
LogLevel level;
38+
string? log_file_path;
39+
LogLevel? log_level;
4440
};
4541

4642
interface Builder {
@@ -58,7 +54,7 @@ interface Builder {
5854
void set_liquidity_source_lsps2(SocketAddress address, PublicKey node_id, string? token);
5955
void set_storage_dir_path(string storage_dir_path);
6056
void set_filesystem_logger(FilesystemLoggerConfig fs_config);
61-
void set_log_facade_logger(LogFacadeLoggerConfig lf_config);
57+
void set_log_facade_logger(LogLevel log_level);
6258
void set_network(Network network);
6359
[Throws=BuildError]
6460
void set_listening_addresses(sequence<SocketAddress> listening_addresses);

src/builder.rs

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
use crate::chain::{ChainSource, DEFAULT_ESPLORA_SERVER_URL};
99
use crate::config::{
10-
default_user_config, Config, EsploraSyncConfig, FilesystemLoggerConfig, LogFacadeLoggerConfig,
11-
WALLET_KEYS_SEED_LEN,
10+
default_log_file_path, default_log_level, default_user_config, Config, EsploraSyncConfig,
11+
FilesystemLoggerConfig, WALLET_KEYS_SEED_LEN,
1212
};
1313

1414
use crate::connection::ConnectionManager;
@@ -19,7 +19,7 @@ use crate::io::sqlite_store::SqliteStore;
1919
use crate::io::utils::{read_node_metrics, write_node_metrics};
2020
use crate::io::vss_store::VssStore;
2121
use crate::liquidity::LiquiditySource;
22-
use crate::logger::{log_error, log_info, LdkLogger, LogWriter, Logger};
22+
use crate::logger::{log_error, log_info, LdkLogger, LogLevel, LogWriter, Logger};
2323
use crate::message_handler::NodeCustomMessageHandler;
2424
use crate::payment::store::PaymentStore;
2525
use crate::peer_store::PeerStore;
@@ -109,10 +109,10 @@ impl Default for LiquiditySourceConfig {
109109
}
110110
}
111111

112-
#[derive(Debug)]
112+
#[derive(Debug, Clone)]
113113
enum LogWriterConfig {
114114
File(FilesystemLoggerConfig),
115-
Log(LogFacadeLoggerConfig),
115+
Log(LogLevel),
116116
Custom(Arc<dyn LogWriter + Send + Sync>),
117117
}
118118

@@ -324,8 +324,8 @@ impl NodeBuilder {
324324
}
325325

326326
/// Configures the [`Node`] instance to write logs to the `log` facade.
327-
pub fn set_log_facade_logger(&mut self, lf_config: LogFacadeLoggerConfig) -> &mut Self {
328-
self.log_writer_config = Some(LogWriterConfig::Log(lf_config));
327+
pub fn set_log_facade_logger(&mut self, log_level: LogLevel) -> &mut Self {
328+
self.log_writer_config = Some(LogWriterConfig::Log(log_level));
329329
self
330330
}
331331

@@ -416,9 +416,7 @@ impl NodeBuilder {
416416
) -> Result<Node, BuildError> {
417417
use bitcoin::key::Secp256k1;
418418

419-
let writer = LogWriterConfig::default();
420-
let log_writer_config =
421-
if let Some(config) = &self.log_writer_config { config } else { &writer };
419+
let log_writer_config = self.log_writer_config.clone().unwrap_or_default();
422420
let logger = setup_logger(&log_writer_config)?;
423421

424422
let seed_bytes = seed_bytes_from_config(
@@ -484,9 +482,7 @@ impl NodeBuilder {
484482
pub fn build_with_vss_store_and_header_provider(
485483
&self, vss_url: String, store_id: String, header_provider: Arc<dyn VssHeaderProvider>,
486484
) -> Result<Node, BuildError> {
487-
let writer = LogWriterConfig::default();
488-
let log_writer_config =
489-
if let Some(config) = &self.log_writer_config { config } else { &writer };
485+
let log_writer_config = self.log_writer_config.clone().unwrap_or_default();
490486
let logger = setup_logger(&log_writer_config)?;
491487

492488
let seed_bytes = seed_bytes_from_config(
@@ -519,9 +515,7 @@ impl NodeBuilder {
519515

520516
/// Builds a [`Node`] instance according to the options previously configured.
521517
pub fn build_with_store(&self, kv_store: Arc<DynStore>) -> Result<Node, BuildError> {
522-
let writer = LogWriterConfig::default();
523-
let log_writer_config =
524-
if let Some(config) = &self.log_writer_config { config } else { &writer };
518+
let log_writer_config = self.log_writer_config.clone().unwrap_or_default();
525519
let logger = setup_logger(&log_writer_config)?;
526520

527521
let seed_bytes = seed_bytes_from_config(
@@ -651,8 +645,8 @@ impl ArcedNodeBuilder {
651645
}
652646

653647
/// Configures the [`Node`] instance to write logs to the `log` facade.
654-
pub fn set_log_facade_logger(&self, lf_config: LogFacadeLoggerConfig) {
655-
self.inner.write().unwrap().set_log_facade_logger(lf_config);
648+
pub fn set_log_facade_logger(&self, log_level: LogLevel) {
649+
self.inner.write().unwrap().set_log_facade_logger(log_level);
656650
}
657651

658652
/// Configures the [`Node`] instance to write logs to the provided custom log writer.
@@ -1275,16 +1269,20 @@ fn build_with_store_internal(
12751269
fn setup_logger(config: &LogWriterConfig) -> Result<Arc<Logger>, BuildError> {
12761270
match config {
12771271
LogWriterConfig::File(fs_logger_config) => {
1278-
let log_file_path = &fs_logger_config.log_file_path;
1272+
let log_file_path = if let Some(fp) = &fs_logger_config.log_file_path {
1273+
fp
1274+
} else {
1275+
&default_log_file_path()
1276+
};
1277+
let log_level = fs_logger_config.log_level.unwrap_or(default_log_level());
12791278

12801279
Ok(Arc::new(
1281-
Logger::new_fs_writer(log_file_path.to_string(), fs_logger_config.level)
1280+
Logger::new_fs_writer(log_file_path, log_level)
12821281
.map_err(|_| BuildError::LoggerSetupFailed)?,
12831282
))
12841283
},
1285-
LogWriterConfig::Log(log_facade_logger_config) => Ok(Arc::new(
1286-
Logger::new_log_facade(log_facade_logger_config.level)
1287-
.map_err(|_| BuildError::LoggerSetupFailed)?,
1284+
LogWriterConfig::Log(log_level) => Ok(Arc::new(
1285+
Logger::new_log_facade(*log_level).map_err(|_| BuildError::LoggerSetupFailed)?,
12881286
)),
12891287
LogWriterConfig::Custom(custom_log_writer) => Ok(Arc::new(
12901288
Logger::new_custom_writer(custom_log_writer.clone())

src/config.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -435,26 +435,31 @@ pub struct FilesystemLoggerConfig {
435435
/// The log file path.
436436
///
437437
/// This specifies the log file path if a destination other than the storage
438-
/// directory, i.e. [`Config::storage_dir_path`], is preferred.
439-
pub log_file_path: String,
438+
/// directory, i.e. [`Config::storage_dir_path`], is preferred. If unconfigured,
439+
/// defaults to [`DEFAULT_STORAGE_DIR_PATH`]/[`DEFAULT_LOG_FILE_PATH`], i.e.
440+
/// `/tmp/ldk_node/ldk_node.log`
441+
pub log_file_path: Option<String>,
440442
/// This specifies the log level.
441-
pub level: LogLevel,
442-
}
443-
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: LogLevel,
443+
///
444+
/// If unconfigured, defaults to [`DEFAULT_LOG_LEVEL`], i.e. `LogLevel::Debug`
445+
pub log_level: Option<LogLevel>,
449446
}
450447

451448
impl Default for FilesystemLoggerConfig {
452449
fn default() -> Self {
453-
let log_file_path = format!("{}/{}", DEFAULT_STORAGE_DIR_PATH, DEFAULT_LOG_FILE_PATH);
454-
Self { log_file_path, level: DEFAULT_LOG_LEVEL }
450+
let log_file_path = default_log_file_path();
451+
Self { log_file_path: Some(log_file_path), log_level: Some(default_log_level()) }
455452
}
456453
}
457454

455+
pub(crate) fn default_log_file_path() -> String {
456+
format!("{}/{}", DEFAULT_STORAGE_DIR_PATH, DEFAULT_LOG_FILE_PATH)
457+
}
458+
459+
pub(crate) fn default_log_level() -> LogLevel {
460+
DEFAULT_LOG_LEVEL
461+
}
462+
458463
#[cfg(test)]
459464
mod tests {
460465
use std::str::FromStr;

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ pub mod graph;
8585
mod hex_utils;
8686
pub mod io;
8787
mod liquidity;
88-
mod logger;
88+
pub mod logger;
8989
mod message_handler;
9090
pub mod payment;
9191
mod peer_store;
@@ -110,8 +110,7 @@ pub use event::Event;
110110

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

113-
pub use config::{FilesystemLoggerConfig, LogFacadeLoggerConfig};
114-
pub use logger::{LogLevel, LogRecord, LogWriter};
113+
pub use config::FilesystemLoggerConfig;
115114

116115
#[cfg(feature = "uniffi")]
117116
use uniffi_types::*;
@@ -146,6 +145,7 @@ use types::{
146145
pub use types::{ChannelDetails, CustomTlvRecord, PeerDetails, UserChannelId};
147146

148147
use logger::{log_error, log_info, log_trace, LdkLogger, Logger};
148+
pub use logger::{LogLevel, LogRecord, LogWriter};
149149

150150
use lightning::chain::BestBlock;
151151
use lightning::events::bump_transaction::Wallet as LdkWallet;

src/logger.rs

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
// http://opensource.org/licenses/MIT>, at your option. You may not use this file except in
66
// accordance with one or both of these licenses.
77

8+
//! Logging-related objects.
9+
810
pub(crate) use lightning::util::logger::{Logger as LdkLogger, Record};
911
pub(crate) use lightning::{log_bytes, log_debug, log_error, log_info, log_trace};
1012

@@ -50,55 +52,43 @@ pub trait LogWriter: Send + Sync + Debug {
5052
fn log(&self, record: LogRecord);
5153
}
5254

53-
#[derive(Debug)]
54-
pub(crate) struct FilesystemLogger {
55-
file_path: String,
56-
level: LogLevel,
57-
}
58-
59-
#[derive(Debug)]
60-
pub(crate) struct LogFacadeLogger {
61-
level: LogLevel,
62-
}
63-
6455
/// Defines a writer for [`Logger`].
6556
#[derive(Debug)]
6657
pub(crate) enum Writer {
6758
/// Writes logs to the file system.
68-
FileWriter(FilesystemLogger),
59+
FileWriter { file_path: String, level: LogLevel },
6960
/// Forwards logs to the `log` facade.
70-
LogFacadeWriter(LogFacadeLogger),
71-
/// Forwards logs to custom writer.
61+
LogFacadeWriter { level: LogLevel },
62+
/// Forwards logs to a custom writer.
7263
CustomWriter(Arc<dyn LogWriter + Send + Sync>),
7364
}
7465

7566
impl LogWriter for Writer {
7667
fn log(&self, record: LogRecord) {
77-
let raw_log = record.args.to_string();
7868
let log = format!(
7969
"{} {:<5} [{}:{}] {}\n",
8070
Utc::now().format("%Y-%m-%d %H:%M:%S"),
8171
record.level.to_string(),
8272
record.module_path,
8373
record.line,
84-
raw_log
74+
record.args
8575
);
8676

8777
match self {
88-
Writer::FileWriter(fs_logger) => {
89-
if record.level < fs_logger.level {
78+
Writer::FileWriter { file_path, level } => {
79+
if record.level < *level {
9080
return;
9181
}
9282

9383
fs::OpenOptions::new()
9484
.create(true)
9585
.append(true)
96-
.open(fs_logger.file_path.clone())
86+
.open(file_path.clone())
9787
.expect("Failed to open log file")
9888
.write_all(log.as_bytes())
9989
.expect("Failed to write to log file")
10090
},
101-
Writer::LogFacadeWriter(log_facade_logger) => match log_facade_logger.level {
91+
Writer::LogFacadeWriter { level } => match level {
10292
LogLevel::Gossip => trace!("{}", log),
10393
LogLevel::Trace => trace!("{}", log),
10494
LogLevel::Debug => debug!("{}", log),
@@ -119,28 +109,24 @@ pub(crate) struct Logger {
119109
impl Logger {
120110
/// Creates a new logger with a filesystem writer. The parameters to this function
121111
/// are the path to the log file, and the log level.
122-
pub fn new_fs_writer(log_file_path: String, level: LogLevel) -> Result<Self, ()> {
123-
if let Some(parent_dir) = Path::new(&log_file_path).parent() {
112+
pub fn new_fs_writer(file_path: &str, level: LogLevel) -> Result<Self, ()> {
113+
if let Some(parent_dir) = Path::new(&file_path).parent() {
124114
fs::create_dir_all(parent_dir)
125115
.map_err(|e| eprintln!("ERROR: Failed to create log parent directory: {}", e))?;
126116

127117
// make sure the file exists.
128118
fs::OpenOptions::new()
129119
.create(true)
130120
.append(true)
131-
.open(&log_file_path)
121+
.open(&file_path)
132122
.map_err(|e| eprintln!("ERROR: Failed to open log file: {}", e))?;
133123
}
134124

135-
let fs_writer = FilesystemLogger { file_path: log_file_path, level };
136-
137-
Ok(Self { writer: Writer::FileWriter(fs_writer) })
125+
Ok(Self { writer: Writer::FileWriter { file_path: file_path.to_string(), level } })
138126
}
139127

140128
pub fn new_log_facade(level: LogLevel) -> Result<Self, ()> {
141-
let log_facade_writer = LogFacadeLogger { level };
142-
143-
Ok(Self { writer: Writer::LogFacadeWriter(log_facade_writer) })
129+
Ok(Self { writer: Writer::LogFacadeWriter { level } })
144130
}
145131

146132
pub fn new_custom_writer(log_writer: Arc<dyn LogWriter + Send + Sync>) -> Result<Self, ()> {
@@ -150,6 +136,22 @@ impl Logger {
150136

151137
impl LdkLogger for Logger {
152138
fn log(&self, record: Record) {
153-
self.writer.log(record.into());
139+
match &self.writer {
140+
Writer::FileWriter { file_path: _, level } => {
141+
if record.level < *level {
142+
return;
143+
}
144+
self.writer.log(record.into());
145+
},
146+
Writer::LogFacadeWriter { level } => {
147+
if record.level < *level {
148+
return;
149+
}
150+
self.writer.log(record.into());
151+
},
152+
Writer::CustomWriter(_arc) => {
153+
self.writer.log(record.into());
154+
},
155+
}
154156
}
155157
}

tests/common/mod.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111
use chrono::Utc;
1212
use ldk_node::config::{Config, EsploraSyncConfig};
1313
use ldk_node::io::sqlite_store::SqliteStore;
14+
use ldk_node::logger::{LogLevel, LogRecord, LogWriter};
1415
use ldk_node::payment::{PaymentDirection, PaymentKind, PaymentStatus};
1516
use ldk_node::{
16-
Builder, CustomTlvRecord, Event, FilesystemLoggerConfig, LightningBalance,
17-
LogFacadeLoggerConfig, LogRecord, LogWriter, Node, NodeError, PendingSweepBalance,
17+
Builder, CustomTlvRecord, Event, FilesystemLoggerConfig, LightningBalance, Node, NodeError,
18+
PendingSweepBalance,
1819
};
1920

2021
use lightning::ln::msgs::SocketAddress;
@@ -254,7 +255,7 @@ pub(crate) enum TestChainSource<'a> {
254255
#[derive(Clone)]
255256
pub(crate) enum TestLogWriter {
256257
File(FilesystemLoggerConfig),
257-
LogFacade(LogFacadeLoggerConfig),
258+
LogFacade(LogLevel),
258259
Custom(Arc<dyn LogWriter + Send + Sync>),
259260
}
260261

@@ -387,8 +388,8 @@ pub(crate) fn setup_node(
387388
TestLogWriter::File(fs_config) => {
388389
builder.set_filesystem_logger(fs_config);
389390
},
390-
TestLogWriter::LogFacade(lf_config) => {
391-
builder.set_log_facade_logger(lf_config);
391+
TestLogWriter::LogFacade(log_level) => {
392+
builder.set_log_facade_logger(log_level);
392393
},
393394
TestLogWriter::Custom(log_writer) => {
394395
builder.set_custom_logger(log_writer);

0 commit comments

Comments
 (0)