#logger #wasm32-unknown-unknown #specifically #js

clg

专为wasm32-unknown-unknown设计的日志记录器

4个版本

0.0.3 2024年6月9日
0.0.2 2024年6月9日
0.0.1 2024年6月9日
0.0.0 2024年6月9日

#169 in WebAssembly

Apache-2.0

19KB
232

clg

专为wasm32-unknown-unknown设计的日志记录器。

crates.io

Documentation Apache-2 licensed

语言/語言 标识符
英语 en-Latn-US
中文 zh-Hans-CN

问答

问:这个是用来做什么的?

答:在Rust中将日志输出到Web/Node.js/Deno控制台。

Screenshot_2024-06-09__09-54-09 Screenshot_2024-06-09__06-23-49

问:为什么不直接使用标准库呢?

答:对于 wasm32-wasi,我们可以直接使用Rust std的 eprintln,以及常规的日志记录器。

但是,对于 wasm32-unknown-unknown,我们需要调用Web控制台,即调用js的 console.log()console.error() 函数。

问:如何使用它?

  • 如果已经配置了日志记录器,请使用日志宏
    • 例如,warn!("{warn_1} {warn_2}")debug!("{dbg_1} {dbg_2}")
    • 在调用 log::debug!("This is a debug message") 之后,输出内容类似于 06:23:16:223 [DEBUG] clg::test_wasm:186 This is a debug message

日志宏

  • log::error!()
  • log::warn!()
  • log::info!()
  • log::debug!()
  • log::trace!()
  • 如果没有配置日志记录器,请使用 clg
    • 例如,clg!("{message_1}")
    • 当调用 clg 宏时,它不会包括额外的日志信息,也不会自动确定日志级别。
    • 由于一些浏览器不支持 console.debug(),因此没有 c_dbg!()

在Rust中调用 c_err!("{msg1} {msg2}") 与在JavaScript中调用以下代码等价

console.error(`${msg1} ${msg2}`)

clg宏:

  • clg::clg!() => console.log()
  • clg::c_err!() => console.error()
  • clg::c_warn!() => console.warn()
  • clg::c_info!() => console.info()
  • clg::c_trace!() => console.trace()

更多使用说明,请见下文。

使用方法

步骤1. 安装wasm-pack

cargo install cargo-binstall
cargo binstall wasm-pack

步骤2. 添加依赖

Cargo.toml:

[lib]
crate-type = ["cdylib"]

[dependencies]
wasm-bindgen = "0.2.92"
log = { version = "0.4.21", features = ["std"] }
clg = "0.0.2"
# js-sys = "0.3.69"
# web-sys = "0.3.69"

步骤3. 配置日志记录器

首先介绍什么是日志级别。

从低到高,它们是

  • 关闭(无日志)
  • 错误
  • 警告(警告)
  • 信息(信息)
  • 调试
  • 跟踪

级别越高,打印的内容越详细。

低级别无法显示高级别的消息。

假设当前级别为警告,以下代码存在

use log::{debug, error, warn};
let id = "div_2";
debug!("Getting DOM element, id: {id}");
let Some(element) = document.get_element_by_id(id) else {
    warn!("Cannot get element");
    error!("An error occurred");
    return;
};

假设debug = 3, warn = 2, error = 1

因为debug(3) > warn(2) > error(1)

当level = 警告(2)时,只能显示警告(2)和错误(1),调试(3)的日志不会显示。

也就是说,上面的代码不会输出"获取DOM元素..."。

Rust中的配置

您可以在Rust中配置日志级别,也可以在js中配置。

src/lib.rs:

use clg::{log_level::LogLevel, ConsoleLogger};
use wasm_bindgen::prelude::wasm_bindgen;

#[wasm_bindgen(js_name = initLogger)]
pub fn init_logger() {
    ConsoleLogger::init(Some(LogLevel::Debug));
}

编译和打包

# You can change nodejs to deno, and finally use deno to execute
wasm-pack build --release --target nodejs --out-dir pkg --out-name wasm

js/index.cjs:

// index.mjs: import * as wasm from "../pkg/wasm.js";
const wasm = require("../pkg/wasm.js");

const _init = wasm.initLogger();
wasm._clg_testLogger();

最后,使用nodejs运行index.cjs

node js/index.cjs

JS中的配置

注意:记录器是全局的。每个线程只能运行一个记录器,不要多次初始化记录器。一旦记录器初始化,您就可以在其他地方直接使用log宏(在Rust函数内部)。

src/lib.rs:

#[allow(unused_imports)]
use clg::ConsoleLogger as _;

js/index.cjs:

const wasm = require("../pkg/wasm.js");

// const lv = wasm._clg_LogLevel.Warn;
const lv = wasm._clg_newLogLevel("debug");
const _init = new wasm._clg_ConsoleLogger(lv);

wasm._clg_testLogger();

运行

node js/index.cjs

依赖项

~6.5–9MB
~173K SLoC