From aa0e1f789e3048dfbb7f47c0fa76ebdfd2496002 Mon Sep 17 00:00:00 2001 From: Azriel Hoh Date: Mon, 20 Apr 2020 12:14:08 +1200 Subject: [PATCH 1/5] Run Rustfmt. --- src/lib.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index fb9353a..940993c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,9 +18,9 @@ //! ``` //! //! # Log Levels -//! +//! //! Rust's log levels map to the browser's console log in the following way. -//! +//! //! | Rust | Web Console | //! |------------|-------------------| //! | `trace!()` | `console.debug()` | @@ -28,7 +28,7 @@ //! | `info!()` | `console.info()` | //! | `warn!()` | `console.warn()` | //! | `error!()` | `console.error()` | -//! +//! //! # Getting Fancy //! //! The feature set provided by this crate is intentionally very basic. If you need more flexible @@ -36,22 +36,22 @@ //! the [`fern`] logger via the [`console_log::log`] function. //! //! # Code Size -//! +//! //! [Twiggy] reports this library adding about 180Kb to the size of a minimal wasm binary in a //! debug build. If you want to avoid this, mark the library as optional and conditionally //! initialize it in your code for non-release builds. -//! +//! //! `Cargo.toml` //! ```toml //! [dependencies] //! cfg_if = "0.1" //! log = "0.4" //! console_log = { version = "0.1", optional = true } -//! +//! //! [features] //! default = ["console_log"] //! ``` -//! +//! //! `lib.rs` //! ```rust,ignore //! use wasm_bindgen::prelude::*; @@ -67,16 +67,16 @@ //! fn init_log() {} //! } //! } -//! +//! //! #[wasm_bindgen] //! pub fn main() { //! init_log(); //! // ... //! } //! ``` -//! +//! //! # Limitations -//! +//! //! The file and line number information associated with the log messages reports locations from //! the shims generated by `wasm-bindgen`, not the location of the logger call. //! @@ -84,7 +84,7 @@ //! [`console_log::log`]: fn.log.html //! [`fern`]: https://docs.rs/fern -use log::{Log, Level, Record, Metadata, SetLoggerError}; +use log::{Level, Log, Metadata, Record, SetLoggerError}; use web_sys::console; static LOGGER: WebConsoleLogger = WebConsoleLogger {}; From 65aca9611a4630ae453ea8ae6a8c9e11c9fcff39 Mon Sep 17 00:00:00 2001 From: Azriel Hoh Date: Mon, 20 Apr 2020 13:42:16 +1200 Subject: [PATCH 2/5] Adds colors for log output behind feature flag. --- Cargo.toml | 8 ++++++ src/lib.rs | 73 +++++++++++++++++++++++++++++++++++++++++++++------- src/style.rs | 33 ++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 src/style.rs diff --git a/Cargo.toml b/Cargo.toml index 320332e..e15b561 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,3 +17,11 @@ version = "0.4" [dependencies.web-sys] version = "0.3" features = ["console"] + +[dependencies.wasm-bindgen] +version = "0.2" +optional = true + +[features] +default = [] +color = ["wasm-bindgen"] diff --git a/src/lib.rs b/src/lib.rs index 940993c..2890706 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -87,6 +87,15 @@ use log::{Level, Log, Metadata, Record, SetLoggerError}; use web_sys::console; +#[cfg(feature = "color")] +use wasm_bindgen::JsValue; + +#[cfg(feature = "color")] +const STYLE: style::Style<'static> = style::Style::default(); + +#[cfg(feature = "color")] +mod style; + static LOGGER: WebConsoleLogger = WebConsoleLogger {}; struct WebConsoleLogger {} @@ -119,16 +128,60 @@ impl Log for WebConsoleLogger { /// .apply()?; /// ``` pub fn log(record: &Record) { - // pick the console.log() variant for the appropriate logging level - let console_log = match record.level() { - Level::Error => console::error_1, - Level::Warn => console::warn_1, - Level::Info => console::info_1, - Level::Debug => console::log_1, - Level::Trace => console::debug_1, - }; - - console_log(&format!("{}", record.args()).into()); + #[cfg(not(feature = "color"))] + { + // pick the console.log() variant for the appropriate logging level + let console_log = match record.level() { + Level::Error => console::error_1, + Level::Warn => console::warn_1, + Level::Info => console::info_1, + Level::Debug => console::log_1, + Level::Trace => console::debug_1, + }; + + console_log(&format!("{}", record.args()).into()); + } + + #[cfg(feature = "color")] + { + // pick the console.log() variant for the appropriate logging level + let console_log = match record.level() { + Level::Error => console::error_4, + Level::Warn => console::warn_4, + Level::Info => console::info_4, + Level::Debug => console::log_4, + Level::Trace => console::debug_4, + }; + + let message = { + let message = format!( + "%c{level}%c {file}:{line} %c\n{text}", + level = record.level(), + file = record.file().unwrap_or_else(|| record.target()), + line = record + .line() + .map_or_else(|| "[Unknown]".to_string(), |line| line.to_string()), + text = record.args(), + ); + JsValue::from(&message) + }; + + let level_style = { + let style_str = match record.level() { + Level::Trace => STYLE.trace, + Level::Debug => STYLE.debug, + Level::Info => STYLE.info, + Level::Warn => STYLE.warn, + Level::Error => STYLE.error, + }; + + JsValue::from(style_str) + }; + + let file_line_style = JsValue::from_str(STYLE.file_line); + let text_style = JsValue::from_str(STYLE.text); + console_log(&message, &level_style, &file_line_style, &text_style); + } } /// Initializes the global logger setting `max_log_level` to the given value. diff --git a/src/style.rs b/src/style.rs new file mode 100644 index 0000000..d17c473 --- /dev/null +++ b/src/style.rs @@ -0,0 +1,33 @@ +/// Log message styling. +/// +/// Adapted from +pub struct Style<'s> { + pub trace: &'s str, + pub debug: &'s str, + pub info: &'s str, + pub warn: &'s str, + pub error: &'s str, + pub file_line: &'s str, + pub text: &'s str, +} + +impl Style<'static> { + /// Returns default style values. + pub const fn default() -> Self { + macro_rules! bg_color { + ($color:expr) => { + concat!("color: white; padding: 0 3px; background: ", $color, ";"); + }; + }; + + Style { + trace: bg_color!("gray"), + debug: bg_color!("blue"), + info: bg_color!("green"), + warn: bg_color!("orange"), + error: bg_color!("darkred"), + file_line: "font-weight: bold; color: inherit", + text: "background: inherit; color: inherit", + } + } +} From c9296dc1eb95d0f2030b0113cbe5830065dd0782 Mon Sep 17 00:00:00 2001 From: Azriel Hoh Date: Mon, 20 Apr 2020 14:13:40 +1200 Subject: [PATCH 3/5] Updated `README.md` and documentation about `"color"` feature. --- README.md | 13 +++++++++++++ img/log_messages_styled.png | Bin 0 -> 19528 bytes src/lib.rs | 13 +++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 img/log_messages_styled.png diff --git a/README.md b/README.md index 117fbd8..6e27d1d 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,19 @@ Rust's log levels map to the browser's console log in the following way. | `warn!()` | `console.warn()` | | `error!()` | `console.error()` | +## Colors + +The `"color"` feature adds styling to the log messages. + +`Cargo.toml` +```toml +console_log = { version = "0.1", features = ["color"] } +``` + +The styled log messages will be rendered as follows: + +![Styled log messages](img/log_messages_styled.png) + ## Code Size [Twiggy](https://github.com/rustwasm/twiggy) reports this library adding about diff --git a/img/log_messages_styled.png b/img/log_messages_styled.png new file mode 100644 index 0000000000000000000000000000000000000000..8d07ea8d041a3dba28f178d2f824f7f230357923 GIT binary patch literal 19528 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 literal 0 HcmV?d00001 diff --git a/src/lib.rs b/src/lib.rs index 2890706..74c771f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -35,6 +35,19 @@ //! formatting of log messages (timestamps, file and line info, etc.) this crate can be used with //! the [`fern`] logger via the [`console_log::log`] function. //! +//! ## Colors +//! +//! The `"color"` feature adds styling to the log messages. +//! +//! `Cargo.toml` +//! ```toml +//! console_log = { version = "0.1", features = ["color"] } +//! ``` +//! +//! The styled log messages will be rendered as follows: +//! +//! ![Styled log messages](img/log_messages_styled.png) +//! //! # Code Size //! //! [Twiggy] reports this library adding about 180Kb to the size of a minimal wasm binary in a From a40b0b75bf8643a1eba9f6be511e95753813d9c9 Mon Sep 17 00:00:00 2001 From: Azriel Hoh Date: Tue, 21 Apr 2020 09:04:33 +1200 Subject: [PATCH 4/5] Restrict `Style` to crate visibility. --- src/style.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/style.rs b/src/style.rs index d17c473..63af347 100644 --- a/src/style.rs +++ b/src/style.rs @@ -1,7 +1,7 @@ /// Log message styling. /// /// Adapted from -pub struct Style<'s> { +pub(crate) struct Style<'s> { pub trace: &'s str, pub debug: &'s str, pub info: &'s str, From 6d8a93c7ad2fa0cb93b7be7c0b2f1e92426891c3 Mon Sep 17 00:00:00 2001 From: Azriel Hoh Date: Tue, 21 Apr 2020 09:06:01 +1200 Subject: [PATCH 5/5] Hide `style` module in documentation. --- src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib.rs b/src/lib.rs index 74c771f..9b925c5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -107,6 +107,7 @@ use wasm_bindgen::JsValue; const STYLE: style::Style<'static> = style::Style::default(); #[cfg(feature = "color")] +#[doc(hidden)] mod style; static LOGGER: WebConsoleLogger = WebConsoleLogger {};