@@ -93,7 +93,6 @@ mod wallet;
9393pub use bip39;
9494pub use bitcoin;
9595pub use lightning;
96- use lightning:: ln:: msgs:: RoutingMessageHandler ;
9796pub use lightning_invoice;
9897
9998pub use error:: Error as NodeError ;
@@ -126,11 +125,13 @@ use lightning::chain::{chainmonitor, BestBlock, Confirm, Watch};
126125use lightning:: ln:: channelmanager:: {
127126 self , ChainParameters , ChannelManagerReadArgs , PaymentId , RecipientOnionFields , Retry ,
128127} ;
128+ use lightning:: ln:: msgs:: RoutingMessageHandler ;
129129use lightning:: ln:: peer_handler:: { IgnoringMessageHandler , MessageHandler } ;
130130use lightning:: ln:: { PaymentHash , PaymentPreimage } ;
131131use lightning:: routing:: scoring:: { ProbabilisticScorer , ProbabilisticScoringParameters } ;
132132
133133use lightning:: util:: config:: { ChannelHandshakeConfig , ChannelHandshakeLimits , UserConfig } ;
134+ pub use lightning:: util:: logger:: Level as LogLevel ;
134135use lightning:: util:: ser:: ReadableArgs ;
135136
136137use lightning_background_processor:: process_events_async;
@@ -173,6 +174,7 @@ const DEFAULT_NETWORK: Network = Network::Bitcoin;
173174const DEFAULT_LISTENING_ADDR : & str = "0.0.0.0:9735" ;
174175const DEFAULT_CLTV_EXPIRY_DELTA : u32 = 144 ;
175176const DEFAULT_ESPLORA_SERVER_URL : & str = "https://blockstream.info/api" ;
177+ const DEFAULT_LOG_LEVEL : LogLevel = LogLevel :: Debug ;
176178
177179// The 'stop gap' parameter used by BDK's wallet sync. This seems to configure the threshold
178180// number of blocks after which BDK stops looking for scripts belonging to the wallet.
@@ -204,9 +206,10 @@ const WALLET_KEYS_SEED_LEN: usize = 64;
204206/// | Parameter | Value |
205207/// |-----------------------------|------------------|
206208/// | `storage_dir_path` | /tmp/ldk_node/ |
207- /// | `network` | Network:: Bitcoin |
209+ /// | `network` | ` Bitcoin` |
208210/// | `listening_address` | 0.0.0.0:9735 |
209211/// | `default_cltv_expiry_delta` | 144 |
212+ /// | `log_level` | `Debug` |
210213///
211214pub struct Config {
212215 /// The path where the underlying LDK and BDK persist their data.
@@ -217,6 +220,10 @@ pub struct Config {
217220 pub listening_address : Option < NetAddress > ,
218221 /// The default CLTV expiry delta to be used for payments.
219222 pub default_cltv_expiry_delta : u32 ,
223+ /// The level at which we log messages.
224+ ///
225+ /// Any messages below this level will be excluded from the logs.
226+ pub log_level : LogLevel ,
220227}
221228
222229impl Default for Config {
@@ -226,6 +233,7 @@ impl Default for Config {
226233 network : DEFAULT_NETWORK ,
227234 listening_address : Some ( DEFAULT_LISTENING_ADDR . parse ( ) . unwrap ( ) ) ,
228235 default_cltv_expiry_delta : DEFAULT_CLTV_EXPIRY_DELTA ,
236+ log_level : DEFAULT_LOG_LEVEL ,
229237 }
230238 }
231239}
@@ -348,6 +356,12 @@ impl Builder {
348356 config. listening_address = Some ( listening_address) ;
349357 }
350358
359+ /// Sets the level at which [`Node`] will log messages.
360+ pub fn set_log_level ( & self , level : LogLevel ) {
361+ let mut config = self . config . write ( ) . unwrap ( ) ;
362+ config. log_level = level;
363+ }
364+
351365 /// Builds a [`Node`] instance with a [`FilesystemStore`] backend and according to the options
352366 /// previously configured.
353367 pub fn build ( & self ) -> Arc < Node < FilesystemStore > > {
@@ -371,7 +385,7 @@ impl Builder {
371385
372386 // Initialize the Logger
373387 let log_file_path = format ! ( "{}/ldk_node.log" , config. storage_dir_path) ;
374- let logger = Arc :: new ( FilesystemLogger :: new ( log_file_path) ) ;
388+ let logger = Arc :: new ( FilesystemLogger :: new ( log_file_path, config . log_level ) ) ;
375389
376390 // Initialize the on-chain wallet and chain access
377391 let seed_bytes = match & * self . entropy_source_config . read ( ) . unwrap ( ) {
@@ -469,7 +483,6 @@ impl Builder {
469483 if e. kind ( ) == std:: io:: ErrorKind :: NotFound {
470484 Arc :: new ( NetworkGraph :: new ( config. network , Arc :: clone ( & logger) ) )
471485 } else {
472- log_error ! ( logger, "Failed to read network graph: {}" , e. to_string( ) ) ;
473486 panic ! ( "Failed to read network graph: {}" , e. to_string( ) ) ;
474487 }
475488 }
@@ -490,7 +503,6 @@ impl Builder {
490503 Arc :: clone ( & logger) ,
491504 ) ) )
492505 } else {
493- log_error ! ( logger, "Failed to read scorer: {}" , e. to_string( ) ) ;
494506 panic ! ( "Failed to read scorer: {}" , e. to_string( ) ) ;
495507 }
496508 }
@@ -609,8 +621,11 @@ impl Builder {
609621 p2p_source
610622 }
611623 GossipSourceConfig :: RapidGossipSync ( rgs_server) => {
612- let latest_sync_timestamp =
613- io:: utils:: read_latest_rgs_sync_timestamp ( Arc :: clone ( & kv_store) ) . unwrap_or ( 0 ) ;
624+ let latest_sync_timestamp = io:: utils:: read_latest_rgs_sync_timestamp (
625+ Arc :: clone ( & kv_store) ,
626+ Arc :: clone ( & logger) ,
627+ )
628+ . unwrap_or ( 0 ) ;
614629 Arc :: new ( GossipSource :: new_rgs (
615630 rgs_server. clone ( ) ,
616631 latest_sync_timestamp,
@@ -648,15 +663,17 @@ impl Builder {
648663 ) ) ;
649664
650665 // Init payment info storage
651- let payment_store = match io:: utils:: read_payments ( Arc :: clone ( & kv_store) ) {
652- Ok ( payments) => {
653- Arc :: new ( PaymentStore :: new ( payments, Arc :: clone ( & kv_store) , Arc :: clone ( & logger) ) )
654- }
655- Err ( e) => {
656- log_error ! ( logger, "Failed to read payment information: {}" , e. to_string( ) ) ;
657- panic ! ( "Failed to read payment information: {}" , e. to_string( ) ) ;
658- }
659- } ;
666+ let payment_store =
667+ match io:: utils:: read_payments ( Arc :: clone ( & kv_store) , Arc :: clone ( & logger) ) {
668+ Ok ( payments) => Arc :: new ( PaymentStore :: new (
669+ payments,
670+ Arc :: clone ( & kv_store) ,
671+ Arc :: clone ( & logger) ,
672+ ) ) ,
673+ Err ( e) => {
674+ panic ! ( "Failed to read payment information: {}" , e. to_string( ) ) ;
675+ }
676+ } ;
660677
661678 let event_queue =
662679 match io:: utils:: read_event_queue ( Arc :: clone ( & kv_store) , Arc :: clone ( & logger) ) {
@@ -665,7 +682,6 @@ impl Builder {
665682 if e. kind ( ) == std:: io:: ErrorKind :: NotFound {
666683 Arc :: new ( EventQueue :: new ( Arc :: clone ( & kv_store) , Arc :: clone ( & logger) ) )
667684 } else {
668- log_error ! ( logger, "Failed to read event queue: {}" , e. to_string( ) ) ;
669685 panic ! ( "Failed to read event queue: {}" , e. to_string( ) ) ;
670686 }
671687 }
@@ -678,7 +694,6 @@ impl Builder {
678694 if e. kind ( ) == std:: io:: ErrorKind :: NotFound {
679695 Arc :: new ( PeerStore :: new ( Arc :: clone ( & kv_store) , Arc :: clone ( & logger) ) )
680696 } else {
681- log_error ! ( logger, "Failed to read peer store: {}" , e. to_string( ) ) ;
682697 panic ! ( "Failed to read peer store: {}" , e. to_string( ) ) ;
683698 }
684699 }
@@ -747,6 +762,8 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
747762 return Err ( Error :: AlreadyRunning ) ;
748763 }
749764
765+ log_info ! ( self . logger, "Starting up LDK Node on network: {}" , self . config. network) ;
766+
750767 let runtime = tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) ;
751768
752769 let event_handler = Arc :: new ( EventHandler :: new (
@@ -969,7 +986,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
969986 return ;
970987 }
971988 _ = interval. tick( ) => {
972- let skip_broadcast = match io:: utils:: read_latest_node_ann_bcast_timestamp( Arc :: clone( & bcast_store) ) {
989+ let skip_broadcast = match io:: utils:: read_latest_node_ann_bcast_timestamp( Arc :: clone( & bcast_store) , Arc :: clone ( & bcast_logger ) ) {
973990 Ok ( latest_bcast_time_secs) => {
974991 // Skip if the time hasn't elapsed yet.
975992 let next_bcast_unix_time = SystemTime :: UNIX_EPOCH + Duration :: from_secs( latest_bcast_time_secs) + NODE_ANN_BCAST_INTERVAL ;
@@ -1049,6 +1066,8 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
10491066 } ) ;
10501067
10511068 * runtime_lock = Some ( runtime) ;
1069+
1070+ log_info ! ( self . logger, "Startup complete." ) ;
10521071 Ok ( ( ) )
10531072 }
10541073
@@ -1057,6 +1076,9 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
10571076 /// After this returns most API methods will return [`Error::NotRunning`].
10581077 pub fn stop ( & self ) -> Result < ( ) , Error > {
10591078 let runtime = self . runtime . write ( ) . unwrap ( ) . take ( ) . ok_or ( Error :: NotRunning ) ?;
1079+
1080+ log_info ! ( self . logger, "Shutting down LDK Node..." ) ;
1081+
10601082 // Stop the runtime.
10611083 match self . stop_sender . send ( ( ) ) {
10621084 Ok ( _) => ( ) ,
@@ -1074,6 +1096,8 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
10741096 self . peer_manager . disconnect_all_peers ( ) ;
10751097
10761098 runtime. shutdown_timeout ( Duration :: from_secs ( 10 ) ) ;
1099+
1100+ log_info ! ( self . logger, "Shutdown complete." ) ;
10771101 Ok ( ( ) )
10781102 }
10791103
@@ -1099,7 +1123,9 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
10991123 ///
11001124 /// **Note:** This **MUST** be called after each event has been handled.
11011125 pub fn event_handled ( & self ) {
1102- self . event_queue . event_handled ( ) . unwrap ( ) ;
1126+ self . event_queue
1127+ . event_handled ( )
1128+ . expect ( "Couldn't mark event handled due to persistence failure" ) ;
11031129 }
11041130
11051131 /// Returns our own node id
0 commit comments