1
+ use std:: io:: Write ;
1
2
use std:: path:: { Path , PathBuf } ;
2
3
3
4
use clap:: Parser ;
@@ -17,6 +18,9 @@ pub struct Args {
17
18
#[ cfg( feature = "websocket" ) ]
18
19
#[ serde( default ) ]
19
20
pub websocket_client : websocket_client:: ClientConfig ,
21
+
22
+ pub log_file : Option < String > ,
23
+ pub log_level : Option < String > ,
20
24
}
21
25
22
26
impl Args {
@@ -75,9 +79,51 @@ pub fn parse() -> anyhow::Result<Args> {
75
79
}
76
80
77
81
let cli = Config :: parse ( ) ;
78
- env_logger:: Builder :: new ( )
79
- . filter_level ( cli. verbose . log_level_filter ( ) )
80
- . filter_module ( "tantivy" , log:: LevelFilter :: Warn ) // Tantivy is too talky at the INFO level
81
- . init ( ) ;
82
- parse_config ( cli. config_path )
82
+ let args = parse_config ( cli. config_path ) ?;
83
+
84
+ let log_level = if let Some ( log_level) = args. log_level . as_ref ( ) {
85
+ log_level. parse ( ) ?
86
+ } else {
87
+ cli. verbose . log_level_filter ( )
88
+ } ;
89
+
90
+ let debug = log_level == log:: LevelFilter :: Debug
91
+ || cli. verbose . log_level_filter ( ) == log:: LevelFilter :: Trace ;
92
+
93
+ if let Some ( log_file) = args. log_file . as_ref ( ) {
94
+ let target = Box :: new ( std:: fs:: File :: create ( log_file) . expect ( "Can't create file" ) ) ;
95
+
96
+ env_logger:: Builder :: new ( )
97
+ . format ( move |buf, record| {
98
+ if debug {
99
+ writeln ! (
100
+ buf,
101
+ "{}:{} {} [{}] - {}" ,
102
+ record. file( ) . unwrap_or( "unknown" ) ,
103
+ record. line( ) . unwrap_or( 0 ) ,
104
+ chrono:: Utc :: now( ) . format( "%Y-%m-%dT%H:%M:%S%.3f" ) ,
105
+ record. level( ) ,
106
+ record. args( )
107
+ )
108
+ } else {
109
+ writeln ! (
110
+ buf,
111
+ "{} [{}] - {}" ,
112
+ chrono:: Utc :: now( ) . format( "%Y-%m-%dT%H:%M:%S%.3f" ) ,
113
+ record. level( ) ,
114
+ record. args( )
115
+ )
116
+ }
117
+ } )
118
+ . target ( env_logger:: Target :: Pipe ( target) )
119
+ . filter_level ( log_level)
120
+ . filter_module ( "tantivy" , log:: LevelFilter :: Warn ) // Tantivy is too talky at the INFO level
121
+ . init ( ) ;
122
+ } else {
123
+ env_logger:: Builder :: new ( )
124
+ . filter_level ( log_level)
125
+ . filter_module ( "tantivy" , log:: LevelFilter :: Warn ) // Tantivy is too talky at the INFO level
126
+ . init ( ) ;
127
+ }
128
+ Ok ( args)
83
129
}
0 commit comments