2
2
extern crate prettytable;
3
3
4
4
use clap:: { Parser , Subcommand } ;
5
+ use tracing:: { level_filters:: LevelFilter , Level } ;
6
+ use tracing_subscriber:: { layer:: SubscriberExt , util:: SubscriberInitExt } ;
5
7
use std:: path:: PathBuf ;
6
8
7
9
mod execute;
@@ -23,6 +25,12 @@ enum Command {
23
25
24
26
#[ clap( arg_required_else_help = true ) ]
25
27
Execute {
28
+ #[ clap( long, required = false , default_value = "ERROR" ) ]
29
+ vm_init_log_level : Level ,
30
+
31
+ #[ clap( long, required = false , default_value = "INFO" ) ]
32
+ vm_exec_log_level : Level ,
33
+
26
34
#[ clap( required = true ) ]
27
35
main_class : String ,
28
36
@@ -32,16 +40,31 @@ enum Command {
32
40
}
33
41
34
42
fn main ( ) {
35
- env_logger :: init ( ) ;
43
+ let set_log_level_fn = tracing_init ( ) ;
36
44
better_panic:: install ( ) ;
37
45
38
46
let args = Args :: parse ( ) ;
39
-
40
47
match args. command {
41
48
Command :: ListClasses { class_paths } => list_classes:: run ( class_paths) ,
42
49
Command :: Execute {
43
50
main_class,
44
51
class_paths,
45
- } => execute:: run ( main_class, class_paths) ,
52
+ vm_init_log_level,
53
+ vm_exec_log_level,
54
+ } => execute:: run ( main_class, class_paths, vm_init_log_level, vm_exec_log_level, set_log_level_fn) ,
46
55
} ;
47
56
}
57
+
58
+ fn tracing_init ( ) -> impl Fn ( Level ) {
59
+ let inital_log_level_filter = LevelFilter :: INFO ;
60
+ let ( filter, reload_handle) = tracing_subscriber:: reload:: Layer :: new ( inital_log_level_filter) ;
61
+
62
+ tracing_subscriber:: registry ( )
63
+ . with ( tracing_subscriber:: fmt:: layer ( ) . with_ansi ( true ) )
64
+ . with ( filter)
65
+ . init ( ) ;
66
+
67
+ move |level : Level | reload_handle. modify ( |layer| {
68
+ * layer = LevelFilter :: from_level ( level) ;
69
+ } ) . unwrap ( )
70
+ }
0 commit comments