11use chrono:: Utc ;
22use ldk_node:: lightning:: util:: logger:: Logger as LdkLogger ;
33use ldk_node:: lightning:: util:: logger:: { Level , Record } ;
4- use ldk_node:: logger:: { LogRecord , LogWriter } ;
4+ use ldk_node:: logger:: { LogLevel , LogRecord , LogWriter } ;
55use std:: fs;
66use std:: io:: { BufWriter , Write } ;
7- use std:: path:: Path ;
7+ use std:: path:: PathBuf ;
88use std:: sync:: Mutex ;
99
10+ /// The type of logger to use.
11+ #[ derive( Debug , Clone ) ]
12+ pub enum LoggerType {
13+ /// A logger that uses the `log` crate facade.
14+ /// This allows integration with existing logging infrastructure.
15+ LogFacade ,
16+ /// A logger that writes to a specified file.
17+ /// The file will be created if it does not exist and its parent directories will be created as needed.
18+ File {
19+ /// The path to the log file.
20+ path : PathBuf ,
21+ } ,
22+ }
23+
1024#[ derive( Debug ) ]
11- pub struct Logger ( Mutex < fs:: File > ) ;
25+ pub ( crate ) enum Logger {
26+ Facade ,
27+ File ( Mutex < fs:: File > ) ,
28+ }
1229
1330impl Logger {
14- pub ( crate ) fn new ( path : & Path ) -> Result < Logger , ( ) > {
15- if path. parent ( ) . is_some_and ( |p| !p. exists ( ) ) {
16- fs:: create_dir_all ( path. parent ( ) . unwrap ( ) ) . map_err ( |_| ( ) ) ?;
31+ pub ( crate ) fn new ( logger_type : & LoggerType ) -> Result < Self , ( ) > {
32+ match logger_type {
33+ LoggerType :: LogFacade => Ok ( Self :: Facade ) ,
34+ LoggerType :: File { path } => {
35+ if path. parent ( ) . is_some_and ( |p| !p. exists ( ) ) {
36+ fs:: create_dir_all ( path. parent ( ) . unwrap ( ) ) . map_err ( |_| ( ) ) ?;
37+ }
38+ Ok ( Self :: File ( Mutex :: new (
39+ fs:: OpenOptions :: new ( ) . create ( true ) . append ( true ) . open ( path) . map_err ( |_| ( ) ) ?,
40+ ) ) )
41+ } ,
1742 }
18- Ok ( Self ( Mutex :: new (
19- fs:: OpenOptions :: new ( ) . create ( true ) . append ( true ) . open ( path) . map_err ( |_| ( ) ) ?,
20- ) ) )
2143 }
2244}
2345
@@ -26,17 +48,41 @@ impl LogWriter for Logger {
2648 if record. level == Level :: Gossip {
2749 return ;
2850 }
29- let mut file = self . 0 . lock ( ) . unwrap ( ) ;
30- let mut buffer = BufWriter :: new ( & mut * file) ;
31- let _ = writeln ! (
32- & mut buffer,
33- "{} {:<5} [{}:{}] {}" ,
34- Utc :: now( ) . format( "%Y-%m-%d %H:%M:%S" ) ,
35- record. level. to_string( ) ,
36- record. module_path,
37- record. line,
38- record. args
39- ) ;
51+
52+ match self {
53+ Logger :: Facade => {
54+ let mut builder = log:: Record :: builder ( ) ;
55+
56+ match record. level {
57+ LogLevel :: Gossip | LogLevel :: Trace => builder. level ( log:: Level :: Trace ) ,
58+ LogLevel :: Debug => builder. level ( log:: Level :: Debug ) ,
59+ LogLevel :: Info => builder. level ( log:: Level :: Info ) ,
60+ LogLevel :: Warn => builder. level ( log:: Level :: Warn ) ,
61+ LogLevel :: Error => builder. level ( log:: Level :: Error ) ,
62+ } ;
63+
64+ log:: logger ( ) . log (
65+ & builder
66+ . module_path ( Some ( record. module_path ) )
67+ . line ( Some ( record. line ) )
68+ . args ( format_args ! ( "{}" , record. args) )
69+ . build ( ) ,
70+ ) ;
71+ } ,
72+ Logger :: File ( fs) => {
73+ let mut file = fs. lock ( ) . unwrap ( ) ;
74+ let mut buffer = BufWriter :: new ( & mut * file) ;
75+ let _ = writeln ! (
76+ & mut buffer,
77+ "{} {:<5} [{}:{}] {}" ,
78+ Utc :: now( ) . format( "%Y-%m-%d %H:%M:%S" ) ,
79+ record. level. to_string( ) ,
80+ record. module_path,
81+ record. line,
82+ record. args
83+ ) ;
84+ } ,
85+ }
4086 }
4187}
4288
0 commit comments