From 4f82769974241f2b7ca8b233f128f02194a2a4f2 Mon Sep 17 00:00:00 2001 From: Dominic Zippilli Date: Fri, 25 Oct 2024 14:34:01 -0400 Subject: [PATCH 1/3] Rename FilesystemLogger to LdkNodeLogger. --- src/builder.rs | 13 ++++++------- src/chain/mod.rs | 14 +++++++------- src/gossip.rs | 8 ++++---- src/io/utils.rs | 6 +++--- src/lib.rs | 14 +++++++------- src/logger.rs | 6 +++--- src/payment/bolt11.rs | 22 +++++++++++----------- src/payment/bolt12.rs | 10 +++++----- src/payment/onchain.rs | 6 +++--- src/payment/spontaneous.rs | 10 +++++----- src/payment/unified_qr.rs | 6 +++--- src/types.rs | 38 +++++++++++++++++++------------------- src/wallet/persist.rs | 6 +++--- 13 files changed, 79 insertions(+), 80 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index c14ffcf5a..4b505e90d 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -16,7 +16,7 @@ use crate::io::sqlite_store::SqliteStore; use crate::io::utils::{read_node_metrics, write_node_metrics}; use crate::io::vss_store::VssStore; use crate::liquidity::LiquiditySource; -use crate::logger::{log_error, log_info, FilesystemLogger, Logger}; +use crate::logger::{log_error, log_info, LdkNodeLogger, Logger}; use crate::message_handler::NodeCustomMessageHandler; use crate::payment::store::PaymentStore; use crate::peer_store::PeerStore; @@ -734,7 +734,7 @@ fn build_with_store_internal( config: Arc, chain_data_source_config: Option<&ChainDataSourceConfig>, gossip_source_config: Option<&GossipSourceConfig>, liquidity_source_config: Option<&LiquiditySourceConfig>, seed_bytes: [u8; 64], - logger: Arc, kv_store: Arc, + logger: Arc, kv_store: Arc, ) -> Result { // Initialize the status fields. let is_listening = Arc::new(AtomicBool::new(false)); @@ -1231,21 +1231,20 @@ fn build_with_store_internal( }) } -fn setup_logger(config: &Config) -> Result, BuildError> { +fn setup_logger(config: &Config) -> Result, BuildError> { let log_dir = match &config.log_dir_path { Some(log_dir) => String::from(log_dir), None => config.storage_dir_path.clone() + "/logs", }; Ok(Arc::new( - FilesystemLogger::new(log_dir, config.log_level) - .map_err(|_| BuildError::LoggerSetupFailed)?, + LdkNodeLogger::new(log_dir, config.log_level).map_err(|_| BuildError::LoggerSetupFailed)?, )) } fn seed_bytes_from_config( config: &Config, entropy_source_config: Option<&EntropySourceConfig>, - logger: Arc, + logger: Arc, ) -> Result<[u8; 64], BuildError> { match entropy_source_config { Some(EntropySourceConfig::SeedBytes(bytes)) => Ok(bytes.clone()), @@ -1267,7 +1266,7 @@ fn seed_bytes_from_config( } fn derive_vss_xprv( - config: Arc, seed_bytes: &[u8; 64], logger: Arc, + config: Arc, seed_bytes: &[u8; 64], logger: Arc, ) -> Result { use bitcoin::key::Secp256k1; diff --git a/src/chain/mod.rs b/src/chain/mod.rs index a7906fc0f..927c94868 100644 --- a/src/chain/mod.rs +++ b/src/chain/mod.rs @@ -21,7 +21,7 @@ use crate::fee_estimator::{ ConfirmationTarget, OnchainFeeEstimator, }; use crate::io::utils::write_node_metrics; -use crate::logger::{log_bytes, log_error, log_info, log_trace, FilesystemLogger, Logger}; +use crate::logger::{log_bytes, log_error, log_info, log_trace, LdkNodeLogger, Logger}; use crate::types::{Broadcaster, ChainMonitor, ChannelManager, DynStore, Sweeper, Wallet}; use crate::{Error, NodeMetrics}; @@ -112,13 +112,13 @@ pub(crate) enum ChainSource { esplora_client: EsploraAsyncClient, onchain_wallet: Arc, onchain_wallet_sync_status: Mutex, - tx_sync: Arc>>, + tx_sync: Arc>>, lightning_wallet_sync_status: Mutex, fee_estimator: Arc, tx_broadcaster: Arc, kv_store: Arc, config: Arc, - logger: Arc, + logger: Arc, node_metrics: Arc>, }, BitcoindRpc { @@ -131,7 +131,7 @@ pub(crate) enum ChainSource { tx_broadcaster: Arc, kv_store: Arc, config: Arc, - logger: Arc, + logger: Arc, node_metrics: Arc>, }, } @@ -140,7 +140,7 @@ impl ChainSource { pub(crate) fn new_esplora( server_url: String, sync_config: EsploraSyncConfig, onchain_wallet: Arc, fee_estimator: Arc, tx_broadcaster: Arc, - kv_store: Arc, config: Arc, logger: Arc, + kv_store: Arc, config: Arc, logger: Arc, node_metrics: Arc>, ) -> Self { let mut client_builder = esplora_client::Builder::new(&server_url); @@ -170,7 +170,7 @@ impl ChainSource { host: String, port: u16, rpc_user: String, rpc_password: String, onchain_wallet: Arc, fee_estimator: Arc, tx_broadcaster: Arc, kv_store: Arc, config: Arc, - logger: Arc, node_metrics: Arc>, + logger: Arc, node_metrics: Arc>, ) -> Self { let bitcoind_rpc_client = Arc::new(BitcoindRpcClient::new(host, port, rpc_user, rpc_password)); @@ -1118,7 +1118,7 @@ impl Filter for ChainSource { fn periodically_archive_fully_resolved_monitors( channel_manager: Arc, chain_monitor: Arc, - kv_store: Arc, logger: Arc, node_metrics: Arc>, + kv_store: Arc, logger: Arc, node_metrics: Arc>, ) -> Result<(), Error> { let mut locked_node_metrics = node_metrics.write().unwrap(); let cur_height = channel_manager.current_best_block().height; diff --git a/src/gossip.rs b/src/gossip.rs index 450b5b5ee..65ce6fe92 100644 --- a/src/gossip.rs +++ b/src/gossip.rs @@ -6,7 +6,7 @@ // accordance with one or both of these licenses. use crate::config::RGS_SYNC_TIMEOUT_SECS; -use crate::logger::{log_trace, FilesystemLogger, Logger}; +use crate::logger::{log_trace, LdkNodeLogger, Logger}; use crate::types::{GossipSync, Graph, P2PGossipSync, RapidGossipSync}; use crate::Error; @@ -24,12 +24,12 @@ pub(crate) enum GossipSource { gossip_sync: Arc, server_url: String, latest_sync_timestamp: AtomicU32, - logger: Arc, + logger: Arc, }, } impl GossipSource { - pub fn new_p2p(network_graph: Arc, logger: Arc) -> Self { + pub fn new_p2p(network_graph: Arc, logger: Arc) -> Self { let gossip_sync = Arc::new(P2PGossipSync::new( network_graph, None::>, @@ -40,7 +40,7 @@ impl GossipSource { pub fn new_rgs( server_url: String, latest_sync_timestamp: u32, network_graph: Arc, - logger: Arc, + logger: Arc, ) -> Self { let gossip_sync = Arc::new(RapidGossipSync::new(network_graph, Arc::clone(&logger))); let latest_sync_timestamp = AtomicU32::new(latest_sync_timestamp); diff --git a/src/io/utils.rs b/src/io/utils.rs index 218fec473..e557ae10f 100644 --- a/src/io/utils.rs +++ b/src/io/utils.rs @@ -13,7 +13,7 @@ use crate::fee_estimator::OnchainFeeEstimator; use crate::io::{ NODE_METRICS_KEY, NODE_METRICS_PRIMARY_NAMESPACE, NODE_METRICS_SECONDARY_NAMESPACE, }; -use crate::logger::{log_error, FilesystemLogger}; +use crate::logger::{log_error, LdkNodeLogger}; use crate::peer_store::PeerStore; use crate::sweep::DeprecatedSpendableOutputInfo; use crate::types::{Broadcaster, DynStore, KeysManager, Sweeper}; @@ -226,7 +226,7 @@ where pub(crate) fn read_output_sweeper( broadcaster: Arc, fee_estimator: Arc, chain_data_source: Arc, keys_manager: Arc, kv_store: Arc, - logger: Arc, + logger: Arc, ) -> Result { let mut reader = Cursor::new(kv_store.read( OUTPUT_SWEEPER_PERSISTENCE_PRIMARY_NAMESPACE, @@ -600,7 +600,7 @@ impl_read_write_change_set_type!( // Reads the full BdkWalletChangeSet or returns default fields pub(crate) fn read_bdk_wallet_change_set( - kv_store: Arc, logger: Arc, + kv_store: Arc, logger: Arc, ) -> Result, std::io::Error> { let mut change_set = BdkWalletChangeSet::default(); diff --git a/src/lib.rs b/src/lib.rs index 8fc3972e1..5ddf0f39f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -142,7 +142,7 @@ use types::{ }; pub use types::{ChannelDetails, PeerDetails, UserChannelId}; -use logger::{log_error, log_info, log_trace, FilesystemLogger, Logger}; +use logger::{log_error, log_info, log_trace, LdkNodeLogger, Logger}; use lightning::chain::BestBlock; use lightning::events::bump_transaction::Wallet as LdkWallet; @@ -180,23 +180,23 @@ pub struct Node { wallet: Arc, chain_source: Arc, tx_broadcaster: Arc, - event_queue: Arc>>, + event_queue: Arc>>, channel_manager: Arc, chain_monitor: Arc, output_sweeper: Arc, peer_manager: Arc, onion_messenger: Arc, - connection_manager: Arc>>, + connection_manager: Arc>>, keys_manager: Arc, network_graph: Arc, gossip_source: Arc, - liquidity_source: Option>>>, + liquidity_source: Option>>>, kv_store: Arc, - logger: Arc, + logger: Arc, _router: Arc, scorer: Arc>, - peer_store: Arc>>, - payment_store: Arc>>, + peer_store: Arc>>, + payment_store: Arc>>, is_listening: Arc, node_metrics: Arc>, } diff --git a/src/logger.rs b/src/logger.rs index 19df24367..bc054fefb 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -18,12 +18,12 @@ use std::io::Write; use std::os::unix::fs::symlink; use std::path::Path; -pub(crate) struct FilesystemLogger { +pub(crate) struct LdkNodeLogger { file_path: String, level: Level, } -impl FilesystemLogger { +impl LdkNodeLogger { pub(crate) fn new(log_dir: String, level: Level) -> Result { let log_file_name = format!("ldk_node_{}.log", chrono::offset::Local::now().format("%Y_%m_%d")); @@ -56,7 +56,7 @@ impl FilesystemLogger { Ok(Self { file_path: log_file_path, level }) } } -impl Logger for FilesystemLogger { +impl Logger for LdkNodeLogger { fn log(&self, record: Record) { if record.level < self.level { return; diff --git a/src/payment/bolt11.rs b/src/payment/bolt11.rs index 708c127bd..8dc788a8a 100644 --- a/src/payment/bolt11.rs +++ b/src/payment/bolt11.rs @@ -13,7 +13,7 @@ use crate::config::{Config, LDK_PAYMENT_RETRY_TIMEOUT}; use crate::connection::ConnectionManager; use crate::error::Error; use crate::liquidity::LiquiditySource; -use crate::logger::{log_error, log_info, FilesystemLogger, Logger}; +use crate::logger::{log_error, log_info, LdkNodeLogger, Logger}; use crate::payment::store::{ LSPFeeLimits, PaymentDetails, PaymentDetailsUpdate, PaymentDirection, PaymentKind, PaymentStatus, PaymentStore, @@ -48,25 +48,25 @@ use std::time::SystemTime; pub struct Bolt11Payment { runtime: Arc>>>, channel_manager: Arc, - connection_manager: Arc>>, + connection_manager: Arc>>, keys_manager: Arc, - liquidity_source: Option>>>, - payment_store: Arc>>, - peer_store: Arc>>, + liquidity_source: Option>>>, + payment_store: Arc>>, + peer_store: Arc>>, config: Arc, - logger: Arc, + logger: Arc, } impl Bolt11Payment { pub(crate) fn new( runtime: Arc>>>, channel_manager: Arc, - connection_manager: Arc>>, + connection_manager: Arc>>, keys_manager: Arc, - liquidity_source: Option>>>, - payment_store: Arc>>, - peer_store: Arc>>, config: Arc, - logger: Arc, + liquidity_source: Option>>>, + payment_store: Arc>>, + peer_store: Arc>>, config: Arc, + logger: Arc, ) -> Self { Self { runtime, diff --git a/src/payment/bolt12.rs b/src/payment/bolt12.rs index 90024b7d3..05bedeb83 100644 --- a/src/payment/bolt12.rs +++ b/src/payment/bolt12.rs @@ -11,7 +11,7 @@ use crate::config::LDK_PAYMENT_RETRY_TIMEOUT; use crate::error::Error; -use crate::logger::{log_error, log_info, FilesystemLogger, Logger}; +use crate::logger::{log_error, log_info, LdkNodeLogger, Logger}; use crate::payment::store::{ PaymentDetails, PaymentDirection, PaymentKind, PaymentStatus, PaymentStore, }; @@ -39,15 +39,15 @@ use std::time::{Duration, SystemTime, UNIX_EPOCH}; pub struct Bolt12Payment { runtime: Arc>>>, channel_manager: Arc, - payment_store: Arc>>, - logger: Arc, + payment_store: Arc>>, + logger: Arc, } impl Bolt12Payment { pub(crate) fn new( runtime: Arc>>>, - channel_manager: Arc, - payment_store: Arc>>, logger: Arc, + channel_manager: Arc, payment_store: Arc>>, + logger: Arc, ) -> Self { Self { runtime, channel_manager, payment_store, logger } } diff --git a/src/payment/onchain.rs b/src/payment/onchain.rs index b43765a97..d134ef914 100644 --- a/src/payment/onchain.rs +++ b/src/payment/onchain.rs @@ -9,7 +9,7 @@ use crate::config::Config; use crate::error::Error; -use crate::logger::{log_error, log_info, FilesystemLogger, Logger}; +use crate::logger::{log_error, log_info, LdkNodeLogger, Logger}; use crate::types::{ChannelManager, Wallet}; use bitcoin::{Address, Amount, Txid}; @@ -26,13 +26,13 @@ pub struct OnchainPayment { wallet: Arc, channel_manager: Arc, config: Arc, - logger: Arc, + logger: Arc, } impl OnchainPayment { pub(crate) fn new( runtime: Arc>>>, wallet: Arc, - channel_manager: Arc, config: Arc, logger: Arc, + channel_manager: Arc, config: Arc, logger: Arc, ) -> Self { Self { runtime, wallet, channel_manager, config, logger } } diff --git a/src/payment/spontaneous.rs b/src/payment/spontaneous.rs index 3be244bb5..581f54fe7 100644 --- a/src/payment/spontaneous.rs +++ b/src/payment/spontaneous.rs @@ -9,7 +9,7 @@ use crate::config::{Config, LDK_PAYMENT_RETRY_TIMEOUT}; use crate::error::Error; -use crate::logger::{log_error, log_info, FilesystemLogger, Logger}; +use crate::logger::{log_error, log_info, LdkNodeLogger, Logger}; use crate::payment::store::{ PaymentDetails, PaymentDirection, PaymentKind, PaymentStatus, PaymentStore, }; @@ -37,17 +37,17 @@ pub struct SpontaneousPayment { runtime: Arc>>>, channel_manager: Arc, keys_manager: Arc, - payment_store: Arc>>, + payment_store: Arc>>, config: Arc, - logger: Arc, + logger: Arc, } impl SpontaneousPayment { pub(crate) fn new( runtime: Arc>>>, channel_manager: Arc, keys_manager: Arc, - payment_store: Arc>>, config: Arc, - logger: Arc, + payment_store: Arc>>, config: Arc, + logger: Arc, ) -> Self { Self { runtime, channel_manager, keys_manager, payment_store, config, logger } } diff --git a/src/payment/unified_qr.rs b/src/payment/unified_qr.rs index 88d372456..c36b8937a 100644 --- a/src/payment/unified_qr.rs +++ b/src/payment/unified_qr.rs @@ -12,7 +12,7 @@ //! [BOLT 11]: https://github.com/lightning/bolts/blob/master/11-payment-encoding.md //! [BOLT 12]: https://github.com/lightning/bolts/blob/master/12-offer-encoding.md use crate::error::Error; -use crate::logger::{log_error, FilesystemLogger, Logger}; +use crate::logger::{log_error, LdkNodeLogger, Logger}; use crate::payment::{Bolt11Payment, Bolt12Payment, OnchainPayment}; use crate::Config; @@ -50,13 +50,13 @@ pub struct UnifiedQrPayment { bolt11_invoice: Arc, bolt12_payment: Arc, config: Arc, - logger: Arc, + logger: Arc, } impl UnifiedQrPayment { pub(crate) fn new( onchain_payment: Arc, bolt11_invoice: Arc, - bolt12_payment: Arc, config: Arc, logger: Arc, + bolt12_payment: Arc, config: Arc, logger: Arc, ) -> Self { Self { onchain_payment, bolt11_invoice, bolt12_payment, config, logger } } diff --git a/src/types.rs b/src/types.rs index 9fae37e18..152c8513e 100644 --- a/src/types.rs +++ b/src/types.rs @@ -8,7 +8,7 @@ use crate::chain::ChainSource; use crate::config::ChannelConfig; use crate::fee_estimator::OnchainFeeEstimator; -use crate::logger::FilesystemLogger; +use crate::logger::LdkNodeLogger; use crate::message_handler::NodeCustomMessageHandler; use lightning::chain::chainmonitor; @@ -38,7 +38,7 @@ pub(crate) type ChainMonitor = chainmonitor::ChainMonitor< Arc, Arc, Arc, - Arc, + Arc, Arc, >; @@ -47,8 +47,8 @@ pub(crate) type PeerManager = lightning::ln::peer_handler::PeerManager< Arc, Arc, Arc, - Arc, - Arc>>, + Arc, + Arc>>, Arc, >; @@ -63,51 +63,51 @@ pub(crate) type ChannelManager = lightning::ln::channelmanager::ChannelManager< Arc, Arc, Arc, - Arc, + Arc, >; -pub(crate) type Broadcaster = crate::tx_broadcaster::TransactionBroadcaster>; +pub(crate) type Broadcaster = crate::tx_broadcaster::TransactionBroadcaster>; pub(crate) type Wallet = - crate::wallet::Wallet, Arc, Arc>; + crate::wallet::Wallet, Arc, Arc>; pub(crate) type KeysManager = crate::wallet::WalletKeysManager< Arc, Arc, - Arc, + Arc, >; pub(crate) type Router = DefaultRouter< Arc, - Arc, + Arc, Arc, Arc>, ProbabilisticScoringFeeParameters, Scorer, >; -pub(crate) type Scorer = ProbabilisticScorer, Arc>; +pub(crate) type Scorer = ProbabilisticScorer, Arc>; -pub(crate) type Graph = gossip::NetworkGraph>; +pub(crate) type Graph = gossip::NetworkGraph>; pub(crate) type UtxoLookup = dyn lightning::routing::utxo::UtxoLookup + Send + Sync; pub(crate) type P2PGossipSync = - lightning::routing::gossip::P2PGossipSync, Arc, Arc>; + lightning::routing::gossip::P2PGossipSync, Arc, Arc>; pub(crate) type RapidGossipSync = - lightning_rapid_gossip_sync::RapidGossipSync, Arc>; + lightning_rapid_gossip_sync::RapidGossipSync, Arc>; pub(crate) type GossipSync = lightning_background_processor::GossipSync< Arc, Arc, Arc, Arc, - Arc, + Arc, >; pub(crate) type OnionMessenger = lightning::onion_message::messenger::OnionMessenger< Arc, Arc, - Arc, + Arc, Arc, Arc, Arc, @@ -117,7 +117,7 @@ pub(crate) type OnionMessenger = lightning::onion_message::messenger::OnionMesse pub(crate) type MessageRouter = lightning::onion_message::messenger::DefaultMessageRouter< Arc, - Arc, + Arc, Arc, >; @@ -127,16 +127,16 @@ pub(crate) type Sweeper = OutputSweeper< Arc, Arc, Arc, - Arc, + Arc, Arc, >; pub(crate) type BumpTransactionEventHandler = lightning::events::bump_transaction::BumpTransactionEventHandler< Arc, - Arc, Arc>>, + Arc, Arc>>, Arc, - Arc, + Arc, >; /// A local, potentially user-provided, identifier of a channel. diff --git a/src/wallet/persist.rs b/src/wallet/persist.rs index 06af541a2..5d2f627df 100644 --- a/src/wallet/persist.rs +++ b/src/wallet/persist.rs @@ -10,7 +10,7 @@ use crate::io::utils::{ write_bdk_wallet_indexer, write_bdk_wallet_local_chain, write_bdk_wallet_network, write_bdk_wallet_tx_graph, }; -use crate::logger::{log_error, FilesystemLogger}; +use crate::logger::{log_error, LdkNodeLogger}; use crate::types::DynStore; use lightning::util::logger::Logger; @@ -22,11 +22,11 @@ use std::sync::Arc; pub(crate) struct KVStoreWalletPersister { latest_change_set: Option, kv_store: Arc, - logger: Arc, + logger: Arc, } impl KVStoreWalletPersister { - pub(crate) fn new(kv_store: Arc, logger: Arc) -> Self { + pub(crate) fn new(kv_store: Arc, logger: Arc) -> Self { Self { latest_change_set: None, kv_store, logger } } } From 2c54a18c5b74c654651d7e70bcf206c126b47aa2 Mon Sep 17 00:00:00 2001 From: Dominic Zippilli Date: Mon, 28 Oct 2024 09:48:28 -0400 Subject: [PATCH 2/3] Make LdkNodeLogger technically customizable, retain default behavior. --- src/builder.rs | 14 +++++++-- src/logger.rs | 83 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 70 insertions(+), 27 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index 4b505e90d..cdb7acb3d 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -16,7 +16,9 @@ use crate::io::sqlite_store::SqliteStore; use crate::io::utils::{read_node_metrics, write_node_metrics}; use crate::io::vss_store::VssStore; use crate::liquidity::LiquiditySource; -use crate::logger::{log_error, log_info, LdkNodeLogger, Logger}; +use crate::logger::{ + default_format, log_error, log_info, FilesystemLogWriter, LdkNodeLogger, Logger, +}; use crate::message_handler::NodeCustomMessageHandler; use crate::payment::store::PaymentStore; use crate::peer_store::PeerStore; @@ -1236,9 +1238,15 @@ fn setup_logger(config: &Config) -> Result, BuildError> { Some(log_dir) => String::from(log_dir), None => config.storage_dir_path.clone() + "/logs", }; - + let filesystem_log_writer = + FilesystemLogWriter::new(log_dir.clone()).map_err(|_| BuildError::LoggerSetupFailed)?; Ok(Arc::new( - LdkNodeLogger::new(log_dir, config.log_level).map_err(|_| BuildError::LoggerSetupFailed)?, + LdkNodeLogger::new( + config.log_level, + Box::new(default_format), + Box::new(move |s| filesystem_log_writer.write(s)), + ) + .map_err(|_| BuildError::LoggerSetupFailed)?, )) } diff --git a/src/logger.rs b/src/logger.rs index bc054fefb..864c1ac58 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -12,19 +12,50 @@ use lightning::util::logger::{Level, Record}; use chrono::Utc; +use std::fmt::Debug; use std::fs; use std::io::Write; #[cfg(not(target_os = "windows"))] use std::os::unix::fs::symlink; use std::path::Path; +use std::sync::Mutex; -pub(crate) struct LdkNodeLogger { - file_path: String, +pub struct LdkNodeLogger { level: Level, + formatter: Box String + Send + Sync>, + writer: Box, } impl LdkNodeLogger { - pub(crate) fn new(log_dir: String, level: Level) -> Result { + pub fn new( + level: Level, formatter: Box String + Send + Sync>, + writer: Box, + ) -> Result { + Ok(Self { level, formatter, writer }) + } +} + +impl Debug for LdkNodeLogger { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "LdkNodeLogger level: {}", self.level) + } +} + +impl Logger for LdkNodeLogger { + fn log(&self, record: Record) { + if record.level < self.level { + return; + } + (self.writer)(&(self.formatter)(&record)) + } +} + +pub(crate) struct FilesystemLogWriter { + log_file: Mutex, +} + +impl FilesystemLogWriter { + pub fn new(log_dir: String) -> Result { let log_file_name = format!("ldk_node_{}.log", chrono::offset::Local::now().format("%Y_%m_%d")); let log_file_path = format!("{}/{}", log_dir, log_file_name); @@ -53,29 +84,33 @@ impl LdkNodeLogger { } } - Ok(Self { file_path: log_file_path, level }) - } -} -impl Logger for LdkNodeLogger { - fn log(&self, record: Record) { - if record.level < self.level { - return; - } - let raw_log = record.args.to_string(); - let log = format!( - "{} {:<5} [{}:{}] {}\n", - Utc::now().format("%Y-%m-%d %H:%M:%S"), - record.level.to_string(), - record.module_path, - record.line, - raw_log + let log_file = Mutex::new( + fs::OpenOptions::new() + .create(true) + .append(true) + .open(log_file_path.clone()) + .map_err(|e| eprintln!("ERROR: Failed to open log file: {}", e))?, ); - fs::OpenOptions::new() - .create(true) - .append(true) - .open(self.file_path.clone()) - .expect("Failed to open log file") + Ok(Self { log_file }) + } + + pub fn write(&self, log: &String) { + self.log_file + .lock() + .expect("log file lock poisoned") .write_all(log.as_bytes()) .expect("Failed to write to log file") } } + +pub(crate) fn default_format(record: &Record) -> String { + let raw_log = record.args.to_string(); + format!( + "{} {:<5} [{}:{}] {}\n", + Utc::now().format("%Y-%m-%d %H:%M:%S"), + record.level.to_string(), + record.module_path, + record.line, + raw_log + ) +} From b0e7fef9098aee27622234a01604a9249ba38d03 Mon Sep 17 00:00:00 2001 From: Dominic Zippilli Date: Mon, 28 Oct 2024 10:22:31 -0400 Subject: [PATCH 3/3] Add customizable logging to configuration. --- src/builder.rs | 47 +++++++++++++++++++---------------------------- src/config.rs | 41 +++++++++++++++++++++++++++++++++-------- 2 files changed, 52 insertions(+), 36 deletions(-) diff --git a/src/builder.rs b/src/builder.rs index cdb7acb3d..e08513f87 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -6,7 +6,9 @@ // accordance with one or both of these licenses. use crate::chain::{ChainSource, DEFAULT_ESPLORA_SERVER_URL}; -use crate::config::{default_user_config, Config, EsploraSyncConfig, WALLET_KEYS_SEED_LEN}; +use crate::config::{ + default_user_config, Config, EsploraSyncConfig, LoggingConfig, WALLET_KEYS_SEED_LEN, +}; use crate::connection::ConnectionManager; use crate::event::EventQueue; @@ -29,8 +31,8 @@ use crate::types::{ }; use crate::wallet::persist::KVStoreWalletPersister; use crate::wallet::Wallet; +use crate::Node; use crate::{io, NodeMetrics}; -use crate::{LogLevel, Node}; use lightning::chain::{chainmonitor, BestBlock, Watch}; use lightning::io::Cursor; @@ -300,12 +302,6 @@ impl NodeBuilder { self } - /// Sets the log dir path if logs need to live separate from the storage directory path. - pub fn set_log_dir_path(&mut self, log_dir_path: String) -> &mut Self { - self.config.log_dir_path = Some(log_dir_path); - self - } - /// Sets the Bitcoin network used. pub fn set_network(&mut self, network: Network) -> &mut Self { self.config.network = network; @@ -335,12 +331,6 @@ impl NodeBuilder { Ok(self) } - /// Sets the level at which [`Node`] will log messages. - pub fn set_log_level(&mut self, level: LogLevel) -> &mut Self { - self.config.log_level = level; - self - } - /// Builds a [`Node`] instance with a [`SqliteStore`] backend and according to the options /// previously configured. pub fn build(&self) -> Result { @@ -1234,20 +1224,21 @@ fn build_with_store_internal( } fn setup_logger(config: &Config) -> Result, BuildError> { - let log_dir = match &config.log_dir_path { - Some(log_dir) => String::from(log_dir), - None => config.storage_dir_path.clone() + "/logs", - }; - let filesystem_log_writer = - FilesystemLogWriter::new(log_dir.clone()).map_err(|_| BuildError::LoggerSetupFailed)?; - Ok(Arc::new( - LdkNodeLogger::new( - config.log_level, - Box::new(default_format), - Box::new(move |s| filesystem_log_writer.write(s)), - ) - .map_err(|_| BuildError::LoggerSetupFailed)?, - )) + match config.logging_config { + LoggingConfig::Custom(ref logger) => Ok(logger.clone()), + LoggingConfig::Filesystem { ref log_dir, log_level } => { + let filesystem_log_writer = FilesystemLogWriter::new(log_dir.clone()) + .map_err(|_| BuildError::LoggerSetupFailed)?; + Ok(Arc::new( + LdkNodeLogger::new( + log_level, + Box::new(default_format), + Box::new(move |s| filesystem_log_writer.write(s)), + ) + .map_err(|_| BuildError::LoggerSetupFailed)?, + )) + }, + } } fn seed_bytes_from_config( diff --git a/src/config.rs b/src/config.rs index d82b64f32..13f1aa7eb 100644 --- a/src/config.rs +++ b/src/config.rs @@ -7,6 +7,7 @@ //! Objects for configuring the node. +use crate::logger::LdkNodeLogger; use crate::payment::SendingParameters; use lightning::ln::msgs::SocketAddress; @@ -105,8 +106,9 @@ pub struct Config { pub storage_dir_path: String, /// The path where logs are stored. /// - /// If set to `None`, logs can be found in the `logs` subdirectory in [`Config::storage_dir_path`]. - pub log_dir_path: Option, + /// In the default configuration logs can be found in the `logs` subdirectory in + /// [`Config::storage_dir_path`], and the log level is set to [`DEFAULT_LOG_LEVEL`]. + pub logging_config: LoggingConfig, /// The used Bitcoin network. pub network: Network, /// The addresses on which the node will listen for incoming connections. @@ -132,10 +134,6 @@ pub struct Config { /// Channels with available liquidity less than the required amount times this value won't be /// used to send pre-flight probes. pub probing_liquidity_limit_multiplier: u64, - /// The level at which we log messages. - /// - /// Any messages below this level will be excluded from the logs. - pub log_level: LogLevel, /// Configuration options pertaining to Anchor channels, i.e., channels for which the /// `option_anchors_zero_fee_htlc_tx` channel type is negotiated. /// @@ -167,12 +165,11 @@ impl Default for Config { fn default() -> Self { Self { storage_dir_path: DEFAULT_STORAGE_DIR_PATH.to_string(), - log_dir_path: None, + logging_config: LoggingConfig::default(), network: DEFAULT_NETWORK, listening_addresses: None, trusted_peers_0conf: Vec::new(), probing_liquidity_limit_multiplier: DEFAULT_PROBING_LIQUIDITY_LIMIT_MULTIPLIER, - log_level: DEFAULT_LOG_LEVEL, anchor_channels_config: Some(AnchorChannelsConfig::default()), sending_parameters: None, node_alias: None, @@ -180,6 +177,34 @@ impl Default for Config { } } +/// Configuration options for logging. +#[derive(Debug, Clone)] +pub enum LoggingConfig { + /// An opinionated filesystem logger. + /// + /// This logger will always write at `{log_dir}/ldk_node_latest.log`, which is a symlink to the + /// most recent log file, which is created and timestamped at initialization. + Filesystem { + /// The absolute path where logs are stored. + log_dir: String, + /// The level at which we log messages. + /// + /// Any messages below this level will be excluded from the logs. + log_level: LogLevel, + }, + /// A custom logger. + Custom(std::sync::Arc), +} + +impl Default for LoggingConfig { + fn default() -> Self { + Self::Filesystem { + log_dir: format!("{}/{}", DEFAULT_STORAGE_DIR_PATH, "logs"), + log_level: DEFAULT_LOG_LEVEL, + } + } +} + /// Configuration options pertaining to 'Anchor' channels, i.e., channels for which the /// `option_anchors_zero_fee_htlc_tx` channel type is negotiated. ///