Skip to content

Commit 974ee28

Browse files
domZippillienigbe
authored andcommitted
feat: initial ldk node logger customization
1. Rename FilesystemLogger to LdkNodeLogger. 2. Make LdkNodeLogger technically customizable, retain default behavior. 3. Add customizable logging to configuration.
1 parent c08c3d5 commit 974ee28

File tree

14 files changed

+183
-129
lines changed

14 files changed

+183
-129
lines changed

src/builder.rs

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
// accordance with one or both of these licenses.
77

88
use crate::chain::{ChainSource, DEFAULT_ESPLORA_SERVER_URL};
9-
use crate::config::{default_user_config, Config, EsploraSyncConfig, WALLET_KEYS_SEED_LEN};
9+
use crate::config::{
10+
default_user_config, Config, EsploraSyncConfig, LoggingConfig, WALLET_KEYS_SEED_LEN,
11+
};
1012

1113
use crate::connection::ConnectionManager;
1214
use crate::event::EventQueue;
@@ -16,7 +18,9 @@ use crate::io::sqlite_store::SqliteStore;
1618
use crate::io::utils::{read_node_metrics, write_node_metrics};
1719
use crate::io::vss_store::VssStore;
1820
use crate::liquidity::LiquiditySource;
19-
use crate::logger::{log_error, log_info, FilesystemLogger, Logger};
21+
use crate::logger::{
22+
default_format, log_error, log_info, FilesystemLogWriter, LdkNodeLogger, Logger,
23+
};
2024
use crate::message_handler::NodeCustomMessageHandler;
2125
use crate::payment::store::PaymentStore;
2226
use crate::peer_store::PeerStore;
@@ -27,8 +31,8 @@ use crate::types::{
2731
};
2832
use crate::wallet::persist::KVStoreWalletPersister;
2933
use crate::wallet::Wallet;
34+
use crate::Node;
3035
use crate::{io, NodeMetrics};
31-
use crate::{LogLevel, Node};
3236

3337
use lightning::chain::{chainmonitor, BestBlock, Watch};
3438
use lightning::io::Cursor;
@@ -333,12 +337,6 @@ impl NodeBuilder {
333337
Ok(self)
334338
}
335339

336-
/// Sets the level at which [`Node`] will log messages.
337-
pub fn set_log_level(&mut self, level: LogLevel) -> &mut Self {
338-
self.config.log_level = level;
339-
self
340-
}
341-
342340
/// Builds a [`Node`] instance with a [`SqliteStore`] backend and according to the options
343341
/// previously configured.
344342
pub fn build(&self) -> Result<Node, BuildError> {
@@ -734,7 +732,7 @@ fn build_with_store_internal(
734732
config: Arc<Config>, chain_data_source_config: Option<&ChainDataSourceConfig>,
735733
gossip_source_config: Option<&GossipSourceConfig>,
736734
liquidity_source_config: Option<&LiquiditySourceConfig>, seed_bytes: [u8; 64],
737-
logger: Arc<FilesystemLogger>, kv_store: Arc<DynStore>,
735+
logger: Arc<LdkNodeLogger>, kv_store: Arc<DynStore>,
738736
) -> Result<Node, BuildError> {
739737
// Initialize the status fields.
740738
let is_listening = Arc::new(AtomicBool::new(false));
@@ -1233,21 +1231,27 @@ fn build_with_store_internal(
12331231

12341232
/// Sets up the node logger, creating a new log file if it does not exist, or utilizing
12351233
/// the existing log file.
1236-
fn setup_logger(config: &Config) -> Result<Arc<FilesystemLogger>, BuildError> {
1237-
let log_file_path = match &config.log_file_path {
1238-
Some(log_dir) => String::from(log_dir),
1239-
None => format!("{}/{}", config.storage_dir_path.clone(), "ldk_node.log"),
1240-
};
1241-
1242-
Ok(Arc::new(
1243-
FilesystemLogger::new(log_file_path, config.log_level)
1244-
.map_err(|_| BuildError::LoggerSetupFailed)?,
1245-
))
1234+
fn setup_logger(config: &Config) -> Result<Arc<LdkNodeLogger>, BuildError> {
1235+
match config.logging_config {
1236+
LoggingConfig::Custom(ref logger) => Ok(logger.clone()),
1237+
LoggingConfig::Filesystem { ref log_dir, log_level } => {
1238+
let filesystem_log_writer = FilesystemLogWriter::new(log_dir.clone())
1239+
.map_err(|_| BuildError::LoggerSetupFailed)?;
1240+
Ok(Arc::new(
1241+
LdkNodeLogger::new(
1242+
log_level,
1243+
Box::new(default_format),
1244+
Box::new(move |s| filesystem_log_writer.write(s)),
1245+
)
1246+
.map_err(|_| BuildError::LoggerSetupFailed)?,
1247+
))
1248+
},
1249+
}
12461250
}
12471251

12481252
fn seed_bytes_from_config(
12491253
config: &Config, entropy_source_config: Option<&EntropySourceConfig>,
1250-
logger: Arc<FilesystemLogger>,
1254+
logger: Arc<LdkNodeLogger>,
12511255
) -> Result<[u8; 64], BuildError> {
12521256
match entropy_source_config {
12531257
Some(EntropySourceConfig::SeedBytes(bytes)) => Ok(bytes.clone()),
@@ -1269,7 +1273,7 @@ fn seed_bytes_from_config(
12691273
}
12701274

12711275
fn derive_vss_xprv(
1272-
config: Arc<Config>, seed_bytes: &[u8; 64], logger: Arc<FilesystemLogger>,
1276+
config: Arc<Config>, seed_bytes: &[u8; 64], logger: Arc<LdkNodeLogger>,
12731277
) -> Result<Xpriv, BuildError> {
12741278
use bitcoin::key::Secp256k1;
12751279

src/chain/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use crate::fee_estimator::{
2121
ConfirmationTarget, OnchainFeeEstimator,
2222
};
2323
use crate::io::utils::write_node_metrics;
24-
use crate::logger::{log_bytes, log_error, log_info, log_trace, FilesystemLogger, Logger};
24+
use crate::logger::{log_bytes, log_error, log_info, log_trace, LdkNodeLogger, Logger};
2525
use crate::types::{Broadcaster, ChainMonitor, ChannelManager, DynStore, Sweeper, Wallet};
2626
use crate::{Error, NodeMetrics};
2727

@@ -112,13 +112,13 @@ pub(crate) enum ChainSource {
112112
esplora_client: EsploraAsyncClient,
113113
onchain_wallet: Arc<Wallet>,
114114
onchain_wallet_sync_status: Mutex<WalletSyncStatus>,
115-
tx_sync: Arc<EsploraSyncClient<Arc<FilesystemLogger>>>,
115+
tx_sync: Arc<EsploraSyncClient<Arc<LdkNodeLogger>>>,
116116
lightning_wallet_sync_status: Mutex<WalletSyncStatus>,
117117
fee_estimator: Arc<OnchainFeeEstimator>,
118118
tx_broadcaster: Arc<Broadcaster>,
119119
kv_store: Arc<DynStore>,
120120
config: Arc<Config>,
121-
logger: Arc<FilesystemLogger>,
121+
logger: Arc<LdkNodeLogger>,
122122
node_metrics: Arc<RwLock<NodeMetrics>>,
123123
},
124124
BitcoindRpc {
@@ -131,7 +131,7 @@ pub(crate) enum ChainSource {
131131
tx_broadcaster: Arc<Broadcaster>,
132132
kv_store: Arc<DynStore>,
133133
config: Arc<Config>,
134-
logger: Arc<FilesystemLogger>,
134+
logger: Arc<LdkNodeLogger>,
135135
node_metrics: Arc<RwLock<NodeMetrics>>,
136136
},
137137
}
@@ -140,7 +140,7 @@ impl ChainSource {
140140
pub(crate) fn new_esplora(
141141
server_url: String, sync_config: EsploraSyncConfig, onchain_wallet: Arc<Wallet>,
142142
fee_estimator: Arc<OnchainFeeEstimator>, tx_broadcaster: Arc<Broadcaster>,
143-
kv_store: Arc<DynStore>, config: Arc<Config>, logger: Arc<FilesystemLogger>,
143+
kv_store: Arc<DynStore>, config: Arc<Config>, logger: Arc<LdkNodeLogger>,
144144
node_metrics: Arc<RwLock<NodeMetrics>>,
145145
) -> Self {
146146
let mut client_builder = esplora_client::Builder::new(&server_url);
@@ -170,7 +170,7 @@ impl ChainSource {
170170
host: String, port: u16, rpc_user: String, rpc_password: String,
171171
onchain_wallet: Arc<Wallet>, fee_estimator: Arc<OnchainFeeEstimator>,
172172
tx_broadcaster: Arc<Broadcaster>, kv_store: Arc<DynStore>, config: Arc<Config>,
173-
logger: Arc<FilesystemLogger>, node_metrics: Arc<RwLock<NodeMetrics>>,
173+
logger: Arc<LdkNodeLogger>, node_metrics: Arc<RwLock<NodeMetrics>>,
174174
) -> Self {
175175
let bitcoind_rpc_client =
176176
Arc::new(BitcoindRpcClient::new(host, port, rpc_user, rpc_password));
@@ -1123,7 +1123,7 @@ impl Filter for ChainSource {
11231123

11241124
fn periodically_archive_fully_resolved_monitors(
11251125
channel_manager: Arc<ChannelManager>, chain_monitor: Arc<ChainMonitor>,
1126-
kv_store: Arc<DynStore>, logger: Arc<FilesystemLogger>, node_metrics: Arc<RwLock<NodeMetrics>>,
1126+
kv_store: Arc<DynStore>, logger: Arc<LdkNodeLogger>, node_metrics: Arc<RwLock<NodeMetrics>>,
11271127
) -> Result<(), Error> {
11281128
let mut locked_node_metrics = node_metrics.write().unwrap();
11291129
let cur_height = channel_manager.current_best_block().height;

src/config.rs

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
//! Objects for configuring the node.
99
10+
use crate::logger::LdkNodeLogger;
1011
use crate::payment::SendingParameters;
1112

1213
use lightning::ln::msgs::SocketAddress;
@@ -108,6 +109,9 @@ pub struct Config {
108109
/// If set to `None`, logs can be found in `ldk_node.log` in the [`Config::storage_dir_path`]
109110
/// directory.
110111
pub log_file_path: Option<String>,
112+
/// In the default configuration logs can be found in the `logs` subdirectory in
113+
/// [`Config::storage_dir_path`], and the log level is set to [`DEFAULT_LOG_LEVEL`].
114+
pub logging_config: LoggingConfig,
111115
/// The used Bitcoin network.
112116
pub network: Network,
113117
/// The addresses on which the node will listen for incoming connections.
@@ -133,10 +137,6 @@ pub struct Config {
133137
/// Channels with available liquidity less than the required amount times this value won't be
134138
/// used to send pre-flight probes.
135139
pub probing_liquidity_limit_multiplier: u64,
136-
/// The level at which we log messages.
137-
///
138-
/// Any messages below this level will be excluded from the logs.
139-
pub log_level: LogLevel,
140140
/// Configuration options pertaining to Anchor channels, i.e., channels for which the
141141
/// `option_anchors_zero_fee_htlc_tx` channel type is negotiated.
142142
///
@@ -169,18 +169,46 @@ impl Default for Config {
169169
Self {
170170
storage_dir_path: DEFAULT_STORAGE_DIR_PATH.to_string(),
171171
log_file_path: None,
172+
logging_config: LoggingConfig::default(),
172173
network: DEFAULT_NETWORK,
173174
listening_addresses: None,
174175
trusted_peers_0conf: Vec::new(),
175176
probing_liquidity_limit_multiplier: DEFAULT_PROBING_LIQUIDITY_LIMIT_MULTIPLIER,
176-
log_level: DEFAULT_LOG_LEVEL,
177177
anchor_channels_config: Some(AnchorChannelsConfig::default()),
178178
sending_parameters: None,
179179
node_alias: None,
180180
}
181181
}
182182
}
183183

184+
/// Configuration options for logging.
185+
#[derive(Debug, Clone)]
186+
pub enum LoggingConfig {
187+
/// An opinionated filesystem logger.
188+
///
189+
/// This logger will always write at `{log_dir}/ldk_node_latest.log`, which is a symlink to the
190+
/// most recent log file, which is created and timestamped at initialization.
191+
Filesystem {
192+
/// The absolute path where logs are stored.
193+
log_dir: String,
194+
/// The level at which we log messages.
195+
///
196+
/// Any messages below this level will be excluded from the logs.
197+
log_level: LogLevel,
198+
},
199+
/// A custom logger.
200+
Custom(std::sync::Arc<LdkNodeLogger>),
201+
}
202+
203+
impl Default for LoggingConfig {
204+
fn default() -> Self {
205+
Self::Filesystem {
206+
log_dir: format!("{}/{}", DEFAULT_STORAGE_DIR_PATH, "logs"),
207+
log_level: DEFAULT_LOG_LEVEL,
208+
}
209+
}
210+
}
211+
184212
/// Configuration options pertaining to 'Anchor' channels, i.e., channels for which the
185213
/// `option_anchors_zero_fee_htlc_tx` channel type is negotiated.
186214
///

src/gossip.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// accordance with one or both of these licenses.
77

88
use crate::config::RGS_SYNC_TIMEOUT_SECS;
9-
use crate::logger::{log_trace, FilesystemLogger, Logger};
9+
use crate::logger::{log_trace, LdkNodeLogger, Logger};
1010
use crate::types::{GossipSync, Graph, P2PGossipSync, RapidGossipSync};
1111
use crate::Error;
1212

@@ -24,12 +24,12 @@ pub(crate) enum GossipSource {
2424
gossip_sync: Arc<RapidGossipSync>,
2525
server_url: String,
2626
latest_sync_timestamp: AtomicU32,
27-
logger: Arc<FilesystemLogger>,
27+
logger: Arc<LdkNodeLogger>,
2828
},
2929
}
3030

3131
impl GossipSource {
32-
pub fn new_p2p(network_graph: Arc<Graph>, logger: Arc<FilesystemLogger>) -> Self {
32+
pub fn new_p2p(network_graph: Arc<Graph>, logger: Arc<LdkNodeLogger>) -> Self {
3333
let gossip_sync = Arc::new(P2PGossipSync::new(
3434
network_graph,
3535
None::<Arc<dyn UtxoLookup + Send + Sync>>,
@@ -40,7 +40,7 @@ impl GossipSource {
4040

4141
pub fn new_rgs(
4242
server_url: String, latest_sync_timestamp: u32, network_graph: Arc<Graph>,
43-
logger: Arc<FilesystemLogger>,
43+
logger: Arc<LdkNodeLogger>,
4444
) -> Self {
4545
let gossip_sync = Arc::new(RapidGossipSync::new(network_graph, Arc::clone(&logger)));
4646
let latest_sync_timestamp = AtomicU32::new(latest_sync_timestamp);

src/io/utils.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::fee_estimator::OnchainFeeEstimator;
1313
use crate::io::{
1414
NODE_METRICS_KEY, NODE_METRICS_PRIMARY_NAMESPACE, NODE_METRICS_SECONDARY_NAMESPACE,
1515
};
16-
use crate::logger::{log_error, FilesystemLogger};
16+
use crate::logger::{log_error, LdkNodeLogger};
1717
use crate::peer_store::PeerStore;
1818
use crate::sweep::DeprecatedSpendableOutputInfo;
1919
use crate::types::{Broadcaster, DynStore, KeysManager, Sweeper};
@@ -226,7 +226,7 @@ where
226226
pub(crate) fn read_output_sweeper(
227227
broadcaster: Arc<Broadcaster>, fee_estimator: Arc<OnchainFeeEstimator>,
228228
chain_data_source: Arc<ChainSource>, keys_manager: Arc<KeysManager>, kv_store: Arc<DynStore>,
229-
logger: Arc<FilesystemLogger>,
229+
logger: Arc<LdkNodeLogger>,
230230
) -> Result<Sweeper, std::io::Error> {
231231
let mut reader = Cursor::new(kv_store.read(
232232
OUTPUT_SWEEPER_PERSISTENCE_PRIMARY_NAMESPACE,
@@ -600,7 +600,7 @@ impl_read_write_change_set_type!(
600600

601601
// Reads the full BdkWalletChangeSet or returns default fields
602602
pub(crate) fn read_bdk_wallet_change_set(
603-
kv_store: Arc<DynStore>, logger: Arc<FilesystemLogger>,
603+
kv_store: Arc<DynStore>, logger: Arc<LdkNodeLogger>,
604604
) -> Result<Option<BdkWalletChangeSet>, std::io::Error> {
605605
let mut change_set = BdkWalletChangeSet::default();
606606

src/lib.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ use types::{
142142
};
143143
pub use types::{ChannelDetails, PeerDetails, UserChannelId};
144144

145-
use logger::{log_error, log_info, log_trace, FilesystemLogger, Logger};
145+
use logger::{log_error, log_info, log_trace, LdkNodeLogger, Logger};
146146

147147
use lightning::chain::BestBlock;
148148
use lightning::events::bump_transaction::Wallet as LdkWallet;
@@ -180,23 +180,23 @@ pub struct Node {
180180
wallet: Arc<Wallet>,
181181
chain_source: Arc<ChainSource>,
182182
tx_broadcaster: Arc<Broadcaster>,
183-
event_queue: Arc<EventQueue<Arc<FilesystemLogger>>>,
183+
event_queue: Arc<EventQueue<Arc<LdkNodeLogger>>>,
184184
channel_manager: Arc<ChannelManager>,
185185
chain_monitor: Arc<ChainMonitor>,
186186
output_sweeper: Arc<Sweeper>,
187187
peer_manager: Arc<PeerManager>,
188188
onion_messenger: Arc<OnionMessenger>,
189-
connection_manager: Arc<ConnectionManager<Arc<FilesystemLogger>>>,
189+
connection_manager: Arc<ConnectionManager<Arc<LdkNodeLogger>>>,
190190
keys_manager: Arc<KeysManager>,
191191
network_graph: Arc<Graph>,
192192
gossip_source: Arc<GossipSource>,
193-
liquidity_source: Option<Arc<LiquiditySource<Arc<FilesystemLogger>>>>,
193+
liquidity_source: Option<Arc<LiquiditySource<Arc<LdkNodeLogger>>>>,
194194
kv_store: Arc<DynStore>,
195-
logger: Arc<FilesystemLogger>,
195+
logger: Arc<LdkNodeLogger>,
196196
_router: Arc<Router>,
197197
scorer: Arc<Mutex<Scorer>>,
198-
peer_store: Arc<PeerStore<Arc<FilesystemLogger>>>,
199-
payment_store: Arc<PaymentStore<Arc<FilesystemLogger>>>,
198+
peer_store: Arc<PeerStore<Arc<LdkNodeLogger>>>,
199+
payment_store: Arc<PaymentStore<Arc<LdkNodeLogger>>>,
200200
is_listening: Arc<AtomicBool>,
201201
node_metrics: Arc<RwLock<NodeMetrics>>,
202202
}

0 commit comments

Comments
 (0)