2025-01-01 04:12:39 +09:00
|
|
|
// Copyright 2018-2025 the Deno authors. MIT license.
|
2021-05-11 14:54:10 +10:00
|
|
|
|
2024-12-31 12:13:39 -05:00
|
|
|
use std::io::Write;
|
|
|
|
|
2025-01-17 15:39:29 -05:00
|
|
|
use deno_runtime::deno_telemetry;
|
|
|
|
use deno_runtime::deno_telemetry::OtelConfig;
|
|
|
|
use deno_runtime::deno_telemetry::OtelConsoleConfig;
|
2024-12-31 12:13:39 -05:00
|
|
|
|
2025-01-17 15:39:29 -05:00
|
|
|
struct CliLogger<FnOnLogStart: Fn(), FnOnLogEnd: Fn()> {
|
2024-12-12 09:17:26 +01:00
|
|
|
otel_console_config: OtelConsoleConfig,
|
|
|
|
logger: env_logger::Logger,
|
2025-01-17 15:39:29 -05:00
|
|
|
on_log_start: FnOnLogStart,
|
|
|
|
on_log_end: FnOnLogEnd,
|
2024-12-12 09:17:26 +01:00
|
|
|
}
|
2021-05-11 14:54:10 +10:00
|
|
|
|
2025-01-17 15:39:29 -05:00
|
|
|
impl<FnOnLogStart: Fn(), FnOnLogEnd: Fn()> CliLogger<FnOnLogStart, FnOnLogEnd> {
|
2021-05-11 14:54:10 +10:00
|
|
|
pub fn filter(&self) -> log::LevelFilter {
|
2024-12-12 09:17:26 +01:00
|
|
|
self.logger.filter()
|
2021-05-11 14:54:10 +10:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-01-17 15:39:29 -05:00
|
|
|
impl<FnOnLogStart: Fn() + Send + Sync, FnOnLogEnd: Fn() + Send + Sync> log::Log
|
|
|
|
for CliLogger<FnOnLogStart, FnOnLogEnd>
|
|
|
|
{
|
2021-05-11 14:54:10 +10:00
|
|
|
fn enabled(&self, metadata: &log::Metadata) -> bool {
|
2024-12-12 09:17:26 +01:00
|
|
|
self.logger.enabled(metadata)
|
2021-05-11 14:54:10 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
fn log(&self, record: &log::Record) {
|
|
|
|
if self.enabled(record.metadata()) {
|
2025-01-17 15:39:29 -05:00
|
|
|
(self.on_log_start)();
|
2024-12-12 09:17:26 +01:00
|
|
|
|
|
|
|
match self.otel_console_config {
|
|
|
|
OtelConsoleConfig::Ignore => {
|
|
|
|
self.logger.log(record);
|
|
|
|
}
|
|
|
|
OtelConsoleConfig::Capture => {
|
|
|
|
self.logger.log(record);
|
|
|
|
deno_telemetry::handle_log(record);
|
|
|
|
}
|
|
|
|
OtelConsoleConfig::Replace => {
|
|
|
|
deno_telemetry::handle_log(record);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-01-17 15:39:29 -05:00
|
|
|
(self.on_log_end)();
|
2021-05-11 14:54:10 +10:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn flush(&self) {
|
2024-12-12 09:17:26 +01:00
|
|
|
self.logger.flush();
|
2021-05-11 14:54:10 +10:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-01-17 15:39:29 -05:00
|
|
|
pub struct InitLoggingOptions<FnOnLogStart: Fn(), FnOnLogEnd: Fn()> {
|
|
|
|
pub on_log_start: FnOnLogStart,
|
|
|
|
pub on_log_end: FnOnLogEnd,
|
|
|
|
pub maybe_level: Option<log::Level>,
|
|
|
|
pub otel_config: Option<OtelConfig>,
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn init<
|
|
|
|
FOnLogStart: Fn() + Send + Sync + 'static,
|
|
|
|
FnOnLogEnd: Fn() + Send + Sync + 'static,
|
|
|
|
>(
|
|
|
|
options: InitLoggingOptions<FOnLogStart, FnOnLogEnd>,
|
|
|
|
) {
|
|
|
|
let log_level = options.maybe_level.unwrap_or(log::Level::Info);
|
2021-05-11 14:54:10 +10:00
|
|
|
let logger = env_logger::Builder::from_env(
|
2024-09-03 09:36:28 +01:00
|
|
|
env_logger::Env::new()
|
|
|
|
// Use `DENO_LOG` and `DENO_LOG_STYLE` instead of `RUST_` prefix
|
|
|
|
.filter_or("DENO_LOG", log_level.to_level_filter().to_string())
|
|
|
|
.write_style("DENO_LOG_STYLE"),
|
2021-05-11 14:54:10 +10:00
|
|
|
)
|
|
|
|
// https://github.com/denoland/deno/issues/6641
|
|
|
|
.filter_module("rustyline", log::LevelFilter::Off)
|
|
|
|
// wgpu crates (gfx_backend), have a lot of useless INFO and WARN logs
|
|
|
|
.filter_module("wgpu", log::LevelFilter::Error)
|
|
|
|
.filter_module("gfx", log::LevelFilter::Error)
|
2024-07-04 20:41:01 -04:00
|
|
|
.filter_module("globset", log::LevelFilter::Error)
|
2021-05-11 14:54:10 +10:00
|
|
|
// used to make available the lsp_debug which is then filtered out at runtime
|
|
|
|
// in the cli logger
|
|
|
|
.filter_module("deno::lsp::performance", log::LevelFilter::Debug)
|
2023-07-18 00:49:03 +02:00
|
|
|
.filter_module("rustls", log::LevelFilter::Off)
|
2024-08-23 11:15:10 +09:00
|
|
|
// swc_ecma_codegen's `srcmap!` macro emits error-level spans only on debug
|
|
|
|
// build:
|
|
|
|
// https://github.com/swc-project/swc/blob/74d6478be1eb8cdf1df096c360c159db64b64d8a/crates/swc_ecma_codegen/src/macros.rs#L112
|
|
|
|
// We suppress them here to avoid flooding our CI logs in integration tests.
|
|
|
|
.filter_module("swc_ecma_codegen", log::LevelFilter::Off)
|
|
|
|
.filter_module("swc_ecma_transforms_optimization", log::LevelFilter::Off)
|
|
|
|
.filter_module("swc_ecma_parser", log::LevelFilter::Error)
|
|
|
|
// Suppress span lifecycle logs since they are too verbose
|
|
|
|
.filter_module("tracing::span", log::LevelFilter::Off)
|
2025-02-12 17:40:40 +01:00
|
|
|
.filter_module("tower_lsp", log::LevelFilter::Trace)
|
|
|
|
.filter_module("opentelemetry_sdk", log::LevelFilter::Off)
|
2024-11-01 12:27:00 -04:00
|
|
|
// for deno_compile, this is too verbose
|
|
|
|
.filter_module("editpe", log::LevelFilter::Error)
|
fix: handle all values for buffers in turbocall codegen (#28170)
Now that ArrayBuffer/ArrayBufferView is a generic Value type, we have to
handle it being passed any value. To do this, thread
FastApiCallbackOptions through the function, and add error raising
logic.
If we run conversion and the value is not valid, we return `isize::MAX`,
and then in cranelift we use this value to know that we should branch to
the error logic.
An example compilation looks like this:
```rust
extern "C" fn print_buffer(ptr: *const u8, len: usize);
```
```clif
function %print_buffer_wrapper(i64, i64, i64, i64) system_v {
sig0 = (i64, i64) system_v
sig1 = (i64) -> i64 system_v
sig2 = (i64) system_v
block0(v0: i64, v1: i64, v2: i64, v3: i64):
v4 = iconst.i64 0x6525_9198_2d00 ; turbocall_ab_contents
v5 = call_indirect sig1, v4(v1)
v6 = iconst.i64 0x7fff_ffff_ffff_ffff
v7 = icmp eq v5, v6
brif v7, block1, block2
block2:
v8 = iconst.i64 0x7558_4c0c_0700 ; sym.ptr
call_indirect sig0, v8(v5, v2)
return
block1 cold:
v9 = iconst.i64 0x6525_9198_2d70 ; turbocall_raise
call_indirect sig2, v9(v3)
return
}
```
Also cleaned up all the `unwrap`s and added some logging.
2025-02-18 17:24:25 +01:00
|
|
|
// too verbose
|
|
|
|
.filter_module("cranelift_codegen", log::LevelFilter::Off)
|
2021-05-11 14:54:10 +10:00
|
|
|
.format(|buf, record| {
|
|
|
|
let mut target = record.target().to_string();
|
|
|
|
if let Some(line_no) = record.line() {
|
|
|
|
target.push(':');
|
|
|
|
target.push_str(&line_no.to_string());
|
|
|
|
}
|
|
|
|
if record.level() <= log::Level::Info
|
|
|
|
|| (record.target() == "deno::lsp::performance"
|
|
|
|
&& record.level() == log::Level::Debug)
|
|
|
|
{
|
|
|
|
// Print ERROR, WARN, INFO and lsp_debug logs as they are
|
|
|
|
writeln!(buf, "{}", record.args())
|
|
|
|
} else {
|
|
|
|
// Add prefix to DEBUG or TRACE logs
|
|
|
|
writeln!(
|
|
|
|
buf,
|
|
|
|
"{} RS - {} - {}",
|
|
|
|
record.level(),
|
|
|
|
target,
|
|
|
|
record.args()
|
|
|
|
)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.build();
|
|
|
|
|
2025-01-17 15:39:29 -05:00
|
|
|
let cli_logger = CliLogger {
|
|
|
|
on_log_start: options.on_log_start,
|
|
|
|
on_log_end: options.on_log_end,
|
2024-12-12 09:17:26 +01:00
|
|
|
logger,
|
2025-01-17 15:39:29 -05:00
|
|
|
otel_console_config: options
|
|
|
|
.otel_config
|
2024-12-12 09:17:26 +01:00
|
|
|
.map(|c| c.console)
|
|
|
|
.unwrap_or(OtelConsoleConfig::Ignore),
|
2025-01-17 15:39:29 -05:00
|
|
|
};
|
2021-05-11 14:54:10 +10:00
|
|
|
let max_level = cli_logger.filter();
|
|
|
|
let r = log::set_boxed_logger(Box::new(cli_logger));
|
|
|
|
if r.is_ok() {
|
|
|
|
log::set_max_level(max_level);
|
|
|
|
}
|
|
|
|
r.expect("Could not install logger.");
|
|
|
|
}
|