Skip to content

Commit 7ecb5e1

Browse files
author
Brian Pfretzschner
committed
Tracing and configurable log level
1 parent f8a578c commit 7ecb5e1

File tree

12 files changed

+52
-119
lines changed

12 files changed

+52
-119
lines changed

cli/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ rt = { path = "../rt" }
1212

1313
clap = { version = "3.1.2", features = ["derive"] }
1414
prettytable-rs = "0.10"
15-
env_logger = "0.11"
1615
anyhow = { version = "1.0", features = ["backtrace"] }
1716
better-panic = "0.3.0"
17+
tracing = "0.1.41"
18+
tracing-subscriber = { version = "0.3.19", features = ["env-filter"] }

cli/src/execute.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,20 @@ use std::path::PathBuf;
22

33
use loader::CompositeLoader;
44
use model::vm::VmThread;
5+
use tracing::Level;
56
use vm::vm_thread::VmTheadImpl;
67
use rt::bootstrap_vm;
78

89
const MAIN_METHOD_NAME: &str = "main";
910
const MAIN_METHOD_SIGNATURE: &str = "([Ljava/lang/String;)V";
1011

11-
pub fn run(main_class: String, class_paths: Vec<PathBuf>) {
12+
pub fn run(
13+
main_class: String,
14+
class_paths: Vec<PathBuf>,
15+
vm_init_log_level: Level,
16+
vm_exec_log_level: Level,
17+
set_log_level_fn: impl Fn(Level),
18+
) {
1219
let parser = parser::ClassfileParser {};
1320

1421
let classloader = loader::classloader_for_paths(class_paths, &parser).unwrap();
@@ -17,7 +24,10 @@ pub fn run(main_class: String, class_paths: Vec<PathBuf>) {
1724
let classloader =
1825
CompositeLoader::open(vec![Box::new(runtime_classloader), Box::new(classloader)]);
1926

27+
set_log_level_fn(vm_init_log_level);
2028
let vm = bootstrap_vm(classloader);
29+
30+
set_log_level_fn(vm_exec_log_level);
2131
VmThread::new(&vm, "Thread-0".to_string()).invoke_method(
2232
&main_class,
2333
&MAIN_METHOD_NAME.to_string(),

cli/src/main.rs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
extern crate prettytable;
33

44
use clap::{Parser, Subcommand};
5+
use tracing::{level_filters::LevelFilter, Level};
6+
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
57
use std::path::PathBuf;
68

79
mod execute;
@@ -23,6 +25,12 @@ enum Command {
2325

2426
#[clap(arg_required_else_help = true)]
2527
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+
2634
#[clap(required = true)]
2735
main_class: String,
2836

@@ -32,16 +40,31 @@ enum Command {
3240
}
3341

3442
fn main() {
35-
env_logger::init();
43+
let set_log_level_fn = tracing_init();
3644
better_panic::install();
3745

3846
let args = Args::parse();
39-
4047
match args.command {
4148
Command::ListClasses { class_paths } => list_classes::run(class_paths),
4249
Command::Execute {
4350
main_class,
4451
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),
4655
};
4756
}
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+
}

loader/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ glob = "0.3.1"
1111
zip = { version = "2.1", default-features = false, features = ["deflate"] }
1212
anyhow = "1.0"
1313
log = "0.4.17"
14+
tracing = "0.1.41"
1415

1516
[dev-dependencies]

model/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ edition = "2021"
77
enumset = "1.1"
88
anyhow = "1.0"
99
itertools = "0.13"
10+
tracing = "0.1.41"

out.txt

Lines changed: 0 additions & 110 deletions
This file was deleted.

parser/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ model = { path = "../model" }
99
enumset = "1.1"
1010
anyhow = "1.0"
1111
cesu8 = "1.1.0"
12+
tracing = "0.1.41"

parser/src/version.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ use model::class::ClassVersion;
55

66
use crate::util;
77

8+
const SUPPORTED_MAJOR_VERSION: u16 = 55; // Corresponds to Java 11
9+
810
pub fn parse<T: Read>(reader: &mut T) -> Result<ClassVersion> {
911
let mut magic = [0u8; 4];
1012
reader.read_exact(&mut magic)?;
@@ -16,8 +18,8 @@ pub fn parse<T: Read>(reader: &mut T) -> Result<ClassVersion> {
1618
let minor = util::read_u16(reader)?;
1719
let major = util::read_u16(reader)?;
1820

19-
if major > 55 {
20-
panic!("Unsupported Classfile version: {}.{} > 51.0.", major, minor);
21+
if major > SUPPORTED_MAJOR_VERSION {
22+
panic!("Unsupported Classfile version: {}.{} > {}.0.", major, minor, SUPPORTED_MAJOR_VERSION);
2123
}
2224

2325
Ok(ClassVersion { major, minor })

rt/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ vm = { path = "../vm" }
1111
log = "0.4.17"
1212
anyhow = "1.0"
1313
dirs = "5.0"
14+
tracing = "0.1.41"
1415

1516
[dev-dependencies]
1617
parser = { path = "../parser" }
1718

1819
rstest = "0.22.0"
1920
pretty_assertions = "1.4.0"
2021
env_logger = "0.11"
21-
ctor = "0.2.8"
22+
ctor = "0.2.8"

vm/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ log = "0.4.17"
1313
lazy_static = "1.4.0"
1414
anyhow = "1.0"
1515
itertools = "0.13"
16+
tracing = "0.1.41"

0 commit comments

Comments
 (0)