From 03398ddace1b37fbbb28bec36651d5cd31496638 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Tue, 30 May 2023 11:34:50 -0400 Subject: [PATCH] feat(runtime): add `WorkerLogLevel` (#19316) This is not really used yet, but provides some infrastructure for doing more fine grained logging in JS. I will add warn messages in a future PR. --- cli/factory.rs | 6 +----- cli/standalone/mod.rs | 3 ++- cli/worker.rs | 7 ++++--- runtime/js/06_util.js | 19 ++++++++++++++----- runtime/js/99_main.js | 12 ++++++------ runtime/lib.rs | 1 + runtime/worker_bootstrap.rs | 35 ++++++++++++++++++++++++++++++++--- 7 files changed, 60 insertions(+), 23 deletions(-) diff --git a/cli/factory.rs b/cli/factory.rs index 8e20e5514e..17d141be14 100644 --- a/cli/factory.rs +++ b/cli/factory.rs @@ -678,11 +678,7 @@ impl CliFactory { ) -> Result { Ok(CliMainWorkerOptions { argv: self.options.argv().clone(), - debug: self - .options - .log_level() - .map(|l| l == log::Level::Debug) - .unwrap_or(false), + log_level: self.options.log_level().unwrap_or(log::Level::Info).into(), coverage_dir: self.options.coverage_dir(), enable_testing_features: self.options.enable_testing_features(), has_node_modules_dir: self.options.has_node_modules_dir(), diff --git a/cli/standalone/mod.rs b/cli/standalone/mod.rs index c7f595e178..1ecb48cd7c 100644 --- a/cli/standalone/mod.rs +++ b/cli/standalone/mod.rs @@ -46,6 +46,7 @@ use deno_runtime::deno_tls::RootCertStoreProvider; use deno_runtime::deno_web::BlobStore; use deno_runtime::permissions::Permissions; use deno_runtime::permissions::PermissionsContainer; +use deno_runtime::WorkerLogLevel; use deno_semver::npm::NpmPackageReqReference; use import_map::parse_from_json; use std::pin::Pin; @@ -423,7 +424,7 @@ pub async fn run( None, CliMainWorkerOptions { argv: metadata.argv, - debug: false, + log_level: WorkerLogLevel::Info, coverage_dir: None, enable_testing_features: false, has_node_modules_dir, diff --git a/cli/worker.rs b/cli/worker.rs index 4a41da1a56..6edf427ea5 100644 --- a/cli/worker.rs +++ b/cli/worker.rs @@ -37,6 +37,7 @@ use deno_runtime::web_worker::WebWorkerOptions; use deno_runtime::worker::MainWorker; use deno_runtime::worker::WorkerOptions; use deno_runtime::BootstrapOptions; +use deno_runtime::WorkerLogLevel; use deno_semver::npm::NpmPackageReqReference; use crate::args::StorageKeyResolver; @@ -73,7 +74,7 @@ pub trait HasNodeSpecifierChecker: Send + Sync { #[derive(Clone)] pub struct CliMainWorkerOptions { pub argv: Vec, - pub debug: bool, + pub log_level: WorkerLogLevel, pub coverage_dir: Option, pub enable_testing_features: bool, pub has_node_modules_dir: bool, @@ -434,7 +435,7 @@ impl CliMainWorkerFactory { cpu_count: std::thread::available_parallelism() .map(|p| p.get()) .unwrap_or(1), - debug_flag: shared.options.debug, + log_level: shared.options.log_level, enable_testing_features: shared.options.enable_testing_features, locale: deno_core::v8::icu::get_language_tag(), location: shared.options.location.clone(), @@ -562,7 +563,7 @@ fn create_web_worker_callback( cpu_count: std::thread::available_parallelism() .map(|p| p.get()) .unwrap_or(1), - debug_flag: shared.options.debug, + log_level: shared.options.log_level, enable_testing_features: shared.options.enable_testing_features, locale: deno_core::v8::icu::get_language_tag(), location: Some(args.main_module.clone()), diff --git a/runtime/js/06_util.js b/runtime/js/06_util.js index e04ae7bd71..971957b7ec 100644 --- a/runtime/js/06_util.js +++ b/runtime/js/06_util.js @@ -5,18 +5,27 @@ const { Promise, SafeArrayIterator, } = primordials; -let logDebug = false; + +// WARNING: Keep this in sync with Rust (search for LogLevel) +const LogLevel = { + Error: 1, + Warn: 2, + Info: 3, + Debug: 4, +}; + +let logLevel = 3; let logSource = "JS"; -function setLogDebug(debug, source) { - logDebug = debug; +function setLogLevel(level, source) { + logLevel = level; if (source) { logSource = source; } } function log(...args) { - if (logDebug) { + if (logLevel >= LogLevel.Debug) { // if we destructure `console` off `globalThis` too early, we don't bind to // the right console, therefore we don't log anything out. globalThis.console.error( @@ -80,6 +89,6 @@ export { log, nonEnumerable, readOnly, - setLogDebug, + setLogLevel, writable, }; diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index 91d34272f9..8fd9a6bd94 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -299,7 +299,7 @@ function runtimeStart( v8Version, tsVersion, target, - debugFlag, + logLevel, noColor, isTty, source, @@ -315,7 +315,7 @@ function runtimeStart( tsVersion, ); core.setBuildInfo(target); - util.setLogDebug(debugFlag, source); + util.setLogLevel(logLevel, source); setNoColor(noColor || !isTty); // deno-lint-ignore prefer-primordials Error.prepareStackTrace = core.prepareStackTrace; @@ -428,7 +428,7 @@ function bootstrapMainRuntime(runtimeOptions) { const { 0: args, 1: cpuCount, - 2: debugFlag, + 2: logLevel, 3: denoVersion, 4: locale, 5: location_, @@ -495,7 +495,7 @@ function bootstrapMainRuntime(runtimeOptions) { v8Version, tsVersion, target, - debugFlag, + logLevel, noColor, isTty, ); @@ -542,7 +542,7 @@ function bootstrapWorkerRuntime( const { 0: args, 1: cpuCount, - 2: debugFlag, + 2: logLevel, 3: denoVersion, 4: locale, 5: location_, @@ -610,7 +610,7 @@ function bootstrapWorkerRuntime( v8Version, tsVersion, target, - debugFlag, + logLevel, noColor, isTty, internalName ?? name, diff --git a/runtime/lib.rs b/runtime/lib.rs index 50822d373e..1e307f492a 100644 --- a/runtime/lib.rs +++ b/runtime/lib.rs @@ -35,3 +35,4 @@ pub mod worker; mod worker_bootstrap; pub use worker_bootstrap::BootstrapOptions; +pub use worker_bootstrap::WorkerLogLevel; diff --git a/runtime/worker_bootstrap.rs b/runtime/worker_bootstrap.rs index ba894f52b3..9627281a68 100644 --- a/runtime/worker_bootstrap.rs +++ b/runtime/worker_bootstrap.rs @@ -6,13 +6,42 @@ use std::thread; use crate::colors; +/// The log level to use when printing diagnostic log messages, warnings, +/// or errors in the worker. +/// +/// Note: This is disconnected with the log crate's log level and the Rust code +/// in this crate will respect that value instead. To specify that, use +/// `log::set_max_level`. +#[derive(Debug, Default, Clone, Copy)] +pub enum WorkerLogLevel { + // WARNING: Ensure this is kept in sync with + // the JS values (search for LogLevel). + Error = 1, + Warn = 2, + #[default] + Info = 3, + Debug = 4, +} + +impl From for WorkerLogLevel { + fn from(value: log::Level) -> Self { + match value { + log::Level::Error => WorkerLogLevel::Error, + log::Level::Warn => WorkerLogLevel::Warn, + log::Level::Info => WorkerLogLevel::Info, + log::Level::Debug => WorkerLogLevel::Debug, + log::Level::Trace => WorkerLogLevel::Debug, + } + } +} + /// Common bootstrap options for MainWorker & WebWorker #[derive(Clone)] pub struct BootstrapOptions { /// Sets `Deno.args` in JS runtime. pub args: Vec, pub cpu_count: usize, - pub debug_flag: bool, + pub log_level: WorkerLogLevel, pub enable_testing_features: bool, pub locale: String, pub location: Option, @@ -44,7 +73,7 @@ impl Default for BootstrapOptions { no_color: !colors::use_color(), is_tty: colors::is_tty(), enable_testing_features: Default::default(), - debug_flag: Default::default(), + log_level: Default::default(), ts_version: Default::default(), locale: "en".to_string(), location: Default::default(), @@ -77,7 +106,7 @@ impl BootstrapOptions { } { - let val = v8::Boolean::new(scope, self.debug_flag); + let val = v8::Integer::new(scope, self.log_level as i32); array.set_index(scope, 2, val.into()); }