From b88150cb5a1f405054ef489c6ca33b0ca9b74b37 Mon Sep 17 00:00:00 2001 From: sevki Date: Tue, 28 May 2024 14:01:09 +0100 Subject: [PATCH] graduate log to stable and add crasdump --- Cargo.lock | 215 ++++++------------------------ Cargo.toml | 31 +++-- README.md | 34 ++++- integration/Cargo.toml | 11 +- integration/src/main.rs | 4 +- integration/src/panics.rs | 13 ++ ok_macros/Cargo.toml | 2 +- ok_macros/src/func_transformer.rs | 87 +++++++++--- ok_macros/src/lib.rs | 22 ++- src/lib.rs | 30 +++-- src/log.rs | 106 +++++++-------- 11 files changed, 257 insertions(+), 298 deletions(-) create mode 100644 integration/src/panics.rs diff --git a/Cargo.lock b/Cargo.lock index f901144..de59dfc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -32,12 +32,6 @@ version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - [[package]] name = "arrayvec" version = "0.7.4" @@ -93,12 +87,6 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" - [[package]] name = "bitvec" version = "1.0.1" @@ -144,6 +132,27 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "colored" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f741c91823341bebf717d4c71bda820630ce065443b58bd1b7451af008355" +dependencies = [ + "is-terminal", + "lazy_static", + "winapi", +] + +[[package]] +name = "colored" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +dependencies = [ + "lazy_static", + "windows-sys 0.48.0", +] + [[package]] name = "core2" version = "0.3.3" @@ -234,36 +243,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "dmsort" version = "1.0.2" @@ -315,6 +294,16 @@ dependencies = [ "core2", ] +[[package]] +name = "fern" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f0c14694cbd524c8720dd69b0e3179344f04ebb5f90f2e4a440c6ea3b2f1ee" +dependencies = [ + "colored 1.9.4", + "log", +] + [[package]] name = "flate2" version = "1.0.29" @@ -435,17 +424,6 @@ dependencies = [ "slab", ] -[[package]] -name = "getrandom" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - [[package]] name = "gimli" version = "0.28.1" @@ -586,16 +564,6 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.5.0", - "libc", -] - [[package]] name = "lock_api" version = "0.4.11" @@ -665,7 +633,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfb67c6dd0fa9b00619c41c5700b6f92d5f418be49b45ddb9970fbd4569df3c8" dependencies = [ - "bitflags 1.3.2", + "bitflags", ] [[package]] @@ -697,12 +665,6 @@ dependencies = [ "nom", ] -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - [[package]] name = "num_cpus" version = "1.16.0" @@ -724,7 +686,7 @@ dependencies = [ [[package]] name = "ok_macros" -version = "0.1.3" +version = "0.1.4" dependencies = [ "darling", "proc-macro2", @@ -735,23 +697,23 @@ dependencies = [ [[package]] name = "okstd" -version = "0.1.3" +version = "0.1.4" dependencies = [ "anyhow", "backtrace", "base64", + "colored 2.1.0", "crc16", "fastvlq", + "fern", "futures", "hex", + "log", "num_cpus", "ok_macros", "rustc-demangle", "serde", "serde_json", - "slog", - "slog-scope", - "slog-term", "sourcemap", "symbolic", "termcolor", @@ -812,7 +774,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4e89a9f2f40b2389ba6da0814c8044bf942bece03dffa1514f84e3b525f4f9a" dependencies = [ - "bitflags 1.3.2", + "bitflags", "elsa", "maybe-owned", "pdb", @@ -853,12 +815,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - [[package]] name = "precomputed-hash" version = "0.1.1" @@ -906,18 +862,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_users" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" -dependencies = [ - "getrandom", - "libredox", - "thiserror", + "bitflags", ] [[package]] @@ -970,12 +915,6 @@ dependencies = [ "semver 0.9.0", ] -[[package]] -name = "rustversion" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" - [[package]] name = "ryu" version = "1.0.17" @@ -1108,30 +1047,6 @@ version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" -[[package]] -name = "slog-scope" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f95a4b4c3274cd2869549da82b57ccc930859bdbf5bcea0424bc5f140b3c786" -dependencies = [ - "arc-swap", - "lazy_static", - "slog", -] - -[[package]] -name = "slog-term" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6e022d0b998abfe5c3782c1f03551a596269450ccd677ea51c56f8b214610e8" -dependencies = [ - "is-terminal", - "slog", - "term", - "thread_local", - "time", -] - [[package]] name = "smallvec" version = "1.13.2" @@ -1321,17 +1236,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - [[package]] name = "termcolor" version = "1.4.1" @@ -1361,47 +1265,6 @@ dependencies = [ "syn 2.0.63", ] -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - [[package]] name = "tinyvec" version = "1.6.0" diff --git a/Cargo.toml b/Cargo.toml index 3e5e9bc..2554709 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,23 @@ [package] name = "okstd" -version = "0.1.3" +version = "0.1.4" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +unstable = ["dep:symbolic", "dep:sourcemap"] + + [dependencies] +symbolic = { version = "12.8.0", features = [ + "common-serde", + "debuginfo-serde", + "demangle", + "symcache", + "debuginfo", +], optional = true } +sourcemap = { version = "8.0.1", optional = true } anyhow = "1.0.81" backtrace = { version = "0.3.71", features = ["serde", "serialize-serde"] } base64 = "0.22.0" @@ -14,21 +26,14 @@ fastvlq = "1.1.1" futures = "0.3.30" hex = "0.4.3" num_cpus = "1.16.0" -ok_macros = { version = "0.1.3", path = "ok_macros", registry = "oksoftware" } +ok_macros = { version = "0.1.4", path = "ok_macros", registry = "oksoftware" } rustc-demangle = "0.1.23" serde = "*" serde_json = "*" -slog = "2.7.0" -slog-scope = "4.4.0" -slog-term = "2.9.1" -sourcemap = "8.0.1" -symbolic = { version = "12.8.0", features = [ - "common-serde", - "debuginfo-serde", - "demangle", - "symcache", - "debuginfo", -] } +log = "0.4" +colored = "2" +fern = { version = "0.6", features = ["colored"] } + termcolor = "1.4.1" tokio = { version = "1.37.0", features = ["full"] } url = "2.5.0" diff --git a/README.md b/README.md index f818a2a..c0d96b2 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ async fn main() { something(); } ``` -## Experimental Features + ### `okstd::log` ```rust #[okstd::log(debug)] @@ -30,4 +30,34 @@ fn something() { debug!("Hello, world!"); println!("Hello, world!"); } -``` \ No newline at end of file +``` + +## Experimental Features under `unstable` feature flag + +```bash + +> [!CAUTION] +> Very unstable and will likely change in the future. + +### `okstd::crashdump` + +```rust +#[okstd::log(info)] +#[okstd::crashdump] +#[okstd::main] +async fn main() { + let a = 0; + let b = 1; + let c = b / a; + panic!("This is a panic"); +} +``` +will return a crashdump string like so + +```text +SourceMap { file: Some("integration/src/panics.rs"), tokens: [], index: [], names: ["backtrace::backtrace::trace_unsynchronized", "backtrace::backtrace::trace", "okstd::notokpanic::panic_hook", "core::ops::function::Fn::call", " as core::ops::function::Fn>::call", "std::panicking::rust_panic_with_hook", "std::panicking::begin_panic_handler::{{closure}}", "std::sys_common::backtrace::__rust_end_short_backtrace", "rust_begin_unwind", "core::panicking::panic_fmt", "core::panicking::panic", "panics::old_main::{{closure}}", "tokio::runtime::park::CachedParkThread::block_on::{{closure}}", "tokio::runtime::park::CachedParkThread::block_on", "tokio::runtime::context::blocking::BlockingRegionGuard::block_on", "tokio::runtime::scheduler::multi_thread::MultiThread::block_on::{{closure}}", "tokio::runtime::context::runtime::enter_runtime", "tokio::runtime::scheduler::multi_thread::MultiThread::block_on", "tokio::runtime::runtime::Runtime::block_on", "::block_on", "panics::main", "core::ops::function::FnOnce::call_once", "std::sys_common::backtrace::__rust_begin_short_backtrace", "std::rt::lang_start::{{closure}}", "std::panicking::try::do_call", "std::panicking::try", "std::panic::catch_unwind", "std::rt::lang_start_internal::{{closure}}", "std::rt::lang_start_internal", "std::rt::lang_start", "main", "_start"], source_root: None, sources: [], sources_prefixed: None, sources_content: [], debug_id: None } +Filename: Ok("/scratch/cargo_target/debug/panics") +Crashdump URL: https://crashdu.mp/🐧/♔/aea3ab2067116e3327bb51dc3bed94cd0/g98qBgj9qBg80qBg7r2Ng7gmOg4nxOgrnxOgt9wOgnmxOg4gpBghhpBggnpBg2spBg7npBg9lpBgp9pBgjsqBgk9pBgwqqBgl+pBgxmpBg/upOg4mqBg4kqBg500Cgnl6Kg6yuDgilvOg500Cgnl6Kg6yuDgohvOgzkqBg9mpBgslpB?cGFuaWMgb2NjdXJyZWQ6IGF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8gYXQgaW50ZWdyYXRpb24vc3JjL3Bhbmljcy5yczoxMToxMw +``` + +[crashdu.mp/🐧/♔/aea3ab2067116e3327bb51dc3bed94cd0/g98qBgj9qBg80qBg7r2Ng7gmOg4nxOgrnxOgt9wOgnmxOg4gpBghhpBggnpBg2spBg7npBg9lpBgp9pBgjsqBgk9pBgwqqBgl+pBgxmpBg/upOg4mqBg4kqBg500Cgnl6Kg6yuDgilvOg500Cgnl6Kg6yuDgohvOgzkqBg9mpBgslpB?cGFuaWMgb2NjdXJyZWQ6IGF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8gYXQgaW50ZWdyYXRpb24vc3JjL3Bhbmljcy5yczoxMToxMw](https://crashdu.mp/🐧/♔/aea3ab2067116e3327bb51dc3bed94cd0/g98qBgj9qBg80qBg7r2Ng7gmOg4nxOgrnxOgt9wOgnmxOg4gpBghhpBggnpBg2spBg7npBg9lpBgp9pBgjsqBgk9pBgwqqBgl+pBgxmpBg/upOg4mqBg4kqBg500Cgnl6Kg6yuDgilvOg500Cgnl6Kg6yuDgohvOgzkqBg9mpBgslpB?cGFuaWMgb2NjdXJyZWQ6IGF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8gYXQgaW50ZWdyYXRpb24vc3JjL3Bhbmljcy5yczoxMToxMw) \ No newline at end of file diff --git a/integration/Cargo.toml b/integration/Cargo.toml index ccfecc3..51a47ef 100644 --- a/integration/Cargo.toml +++ b/integration/Cargo.toml @@ -6,4 +6,13 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -okstd = { version = "*", path = ".." } +okstd = { version = "*", path = "..", features = ["unstable"]} + +[[bin]] +name = "log" +path = "src/main.rs" + +[[bin]] +name = "panics" +path = "src/panics.rs" + diff --git a/integration/src/main.rs b/integration/src/main.rs index 00b0f25..ff62383 100644 --- a/integration/src/main.rs +++ b/integration/src/main.rs @@ -5,8 +5,8 @@ async fn main() { something(); } -#[okstd::log(debug)] +#[okstd::log(info)] fn something() { - debug!("Hello, world!"); + info!("Hello, world!"); println!("Hello, world!"); } diff --git a/integration/src/panics.rs b/integration/src/panics.rs new file mode 100644 index 0000000..dc16c7e --- /dev/null +++ b/integration/src/panics.rs @@ -0,0 +1,13 @@ +use core::panic; + +use okstd::prelude::*; + +#[okstd::log(info)] +#[okstd::crashdump] +#[okstd::main] +async fn main() { + let a = 0; + let b = 1; + let _c = b / a; + panic!("This is a panic"); +} \ No newline at end of file diff --git a/ok_macros/Cargo.toml b/ok_macros/Cargo.toml index 4b6595d..11cc8c1 100644 --- a/ok_macros/Cargo.toml +++ b/ok_macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ok_macros" -version = "0.1.3" +version = "0.1.4" edition = "2021" diff --git a/ok_macros/src/func_transformer.rs b/ok_macros/src/func_transformer.rs index 83483a6..193be86 100644 --- a/ok_macros/src/func_transformer.rs +++ b/ok_macros/src/func_transformer.rs @@ -1,8 +1,6 @@ use proc_macro::TokenStream; use quote::quote; -use syn::parse::{ParseBuffer, ParseStream}; use syn::{parse_macro_input, punctuated::Punctuated, ItemFn}; -use syn::{parse_quote, Attribute, Meta, Token}; pub fn transform_function( args: proc_macro::TokenStream, @@ -58,14 +56,10 @@ pub fn transform_function( let orig_ident = item_fn.sig.ident.clone(); // Rename the `test` function to `old_test` - let new_name = format!("__logging_{}", orig_ident.to_string()); + let new_name = format!("__logging_{}", orig_ident); let old_ident = syn::Ident::new(new_name.as_str(), item_fn.sig.ident.span()); item_fn.sig.ident = old_ident.clone(); - let parsed = quote!(slog_o!()); - - - if level == Level::Off { return old_fn; } @@ -74,27 +68,86 @@ pub fn transform_function( let level_token = match level { Level::Off => quote! {}, - Level::Critical => quote! {slog::Level::Critical}, - Level::Error => quote! {slog::Level::Error}, - Level::Warning => quote! {slog::Level::Warning}, - Level::Info => quote! {slog::Level::Info}, - Level::Debug => quote! {slog::Level::Debug}, - Level::Trace => quote! {slog::Level::Trace}, + Level::Critical => quote! {LevelFilter::Critical}, + Level::Error => quote! {LevelFilter::Error}, + Level::Warning => quote! {LevelFilter::Warning}, + Level::Info => quote! {LevelFilter::Info}, + Level::Debug => quote! {LevelFilter::Debug}, + Level::Trace => quote! {LevelFilter::Trace}, }; let body = &item_fn.block; let result = quote! { + #[allow(unused_must_use, unreachable_code)] #( #attrs )* #asyncness fn #fn_name #generics(#inputs) #output #where_clause { - setup_logging(); - scope(&logger().new(o!()), - || #body - ) + setup_logging(#level_token); + return #body } }; TokenStream::from(result) } + + +/// setup panic hook for crashdu.mp +/// similar to log, we just want to setup the panic hook +/// and keep the function as is +/// +/// # Example +/// +/// ```rust,notest +/// #[okstd::crashdump] +/// fn does_something() { +/// // do something +/// } +///``` +/// to +/// ```rust,notest +/// fn does_something() { +/// setup_panic_hook(); +/// // do something +/// } +/// ``` +pub fn setup_panic_hook( + _args: proc_macro::TokenStream, + input: proc_macro::TokenStream, +) -> proc_macro::TokenStream { + + + let mut item_fn = parse_macro_input!(input as ItemFn); + + let fn_name = &item_fn.clone().sig.ident; + + let attrs: &Vec = &item_fn.attrs; + let asyncness: &Option = &item_fn.sig.asyncness; + let generics: &syn::Generics = &item_fn.sig.generics; + let inputs: &Punctuated = &item_fn.sig.inputs; + + let output: &syn::ReturnType = &item_fn.sig.output; + let where_clause: &Option = &item_fn.sig.generics.where_clause; + + let orig_ident = item_fn.sig.ident.clone(); + // Rename the `test` function to `old_test` + let new_name = format!("__panic_hook_{}", orig_ident); + let old_ident = syn::Ident::new(new_name.as_str(), item_fn.sig.ident.span()); + item_fn.sig.ident = old_ident.clone(); + + let body = &item_fn.block; + + let result = quote! { + #[allow(unused_must_use)] + #( #attrs )* + #asyncness fn #fn_name #generics(#inputs) #output + #where_clause { + std::panic::set_hook(Box::new(panic_hook)); + return #body + } + + }; + + TokenStream::from(result) +} \ No newline at end of file diff --git a/ok_macros/src/lib.rs b/ok_macros/src/lib.rs index 6fd5c9a..70778a1 100644 --- a/ok_macros/src/lib.rs +++ b/ok_macros/src/lib.rs @@ -2,19 +2,11 @@ extern crate proc_macro; extern crate syn; -#[macro_use(slog_o, slog_info, slog_log, slog_record, slog_record_static, slog_b, slog_kv)] -extern crate slog; -use darling::{Error, FromMeta}; use proc_macro::TokenStream; -use quote::{quote, ToTokens}; +use quote::quote; + +use syn::{parse_macro_input, ItemFn}; -use syn::parse_quote; -use syn::punctuated::Punctuated; -use syn::{ - parse_macro_input, spanned::Spanned, token, Expr, ExprAsync, ExprAwait, ExprBlock, ExprCall, ExprClosure, - ExprParen, FnArg, Ident, ItemFn, Meta, Pat, Result, ReturnType, Stmt, Type, TypePath, -}; - mod func_transformer; #[proc_macro_attribute] @@ -33,8 +25,6 @@ pub fn main(_attr: TokenStream, item: TokenStream) -> TokenStream { // Generate the new `main` function let new_main = quote! { fn main() { - set_hook(Box::new(panic_hook)); - setup_logging(); let rt = Runtimes::setup_runtimes().unwrap(); rt.block_on(#old_main_ident()) } @@ -55,7 +45,7 @@ pub fn test(_attr: TokenStream, item: TokenStream) -> TokenStream { let mut input = parse_macro_input!(item as ItemFn); let orig_ident = input.sig.ident.clone(); // Rename the `test` function to `old_test` - let new_name = format!("old_test_{}", orig_ident.to_string()); + let new_name = format!("old_test_{}", orig_ident); let old_test_ident = syn::Ident::new(new_name.as_str(), input.sig.ident.span()); input.sig.ident = old_test_ident.clone(); @@ -87,6 +77,10 @@ pub fn test(_attr: TokenStream, item: TokenStream) -> TokenStream { output.into() } +#[proc_macro_attribute] +pub fn crashdump(args: TokenStream, input: TokenStream) -> TokenStream { + func_transformer::setup_panic_hook(args, input) +} #[proc_macro_attribute] pub fn log(args: TokenStream, input: TokenStream) -> TokenStream { diff --git a/src/lib.rs b/src/lib.rs index cce8d69..6a287ab 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,10 +2,12 @@ pub mod log; pub mod okasync; + +#[cfg(feature = "unstable")] pub mod notokpanic; mod e2e_tests; -extern crate slog; +extern crate fern; pub mod prelude { pub use crate::okasync::*; @@ -14,24 +16,24 @@ pub mod prelude { pub use super::main; // re-export the slog macros - pub use slog_scope::crit; - pub use slog_scope::debug; - pub use slog_scope::error; - pub use slog_scope::info; - pub use slog_scope::trace; - pub use slog_scope::warn; - pub use slog_scope::scope; - pub use slog_scope::logger; - pub use slog::OwnedKV; - pub use slog::o; + pub use fern::*; + pub use log::debug; + pub use log::error; + pub use log::info; + pub use log::trace; + pub use log::warn; - pub use slog_scope::set_global_logger; + pub use log::LevelFilter; pub use std::panic::set_hook; - + + #[cfg(feature = "unstable")] pub use crate::notokpanic::panic_hook; } pub use ok_macros::main; pub use ok_macros::test; -pub use ok_macros::log; \ No newline at end of file +pub use ok_macros::log; + +#[cfg(feature = "unstable")] +pub use ok_macros::crashdump; \ No newline at end of file diff --git a/src/log.rs b/src/log.rs index f2e8459..722af4d 100644 --- a/src/log.rs +++ b/src/log.rs @@ -1,15 +1,13 @@ -use std::{io::Write, ops::Add, path::PathBuf}; +use colored::*; +use fern::colors::ColoredLevelConfig; +use std::{io, path::PathBuf}; -use slog::{slog_o, Drain, Logger}; - -use termcolor::{BufferWriter, Color, ColorChoice, ColorSpec, WriteColor}; - -// get module colour hashes the module name -// and attempts to return a uniqe color as far as ansi colors go -fn get_module_colour(module: &str) -> Color { +// get module color hashes the module name +// and attempts to return a unique color as far as ansi colors go +fn get_module_color(module: &str) -> colored::Color { // crc16 is a good hash for this let hash = crc16::State::::calculate(module.as_bytes()); - let hash = hash.add(5); + let hash = hash + 5; match hash % 6 { 0 => Color::Red, 1 => Color::Green, @@ -21,57 +19,49 @@ fn get_module_colour(module: &str) -> Color { } } +pub fn setup_logging(level: log::LevelFilter) -> Result<(), fern::InitError> { + let colors = ColoredLevelConfig::new() + .error(fern::colors::Color::Red) + .warn(fern::colors::Color::Yellow) + .info(fern::colors::Color::Green) + .debug(fern::colors::Color::Blue) + .trace(fern::colors::Color::Cyan); -pub fn setup_logging() -> Logger { - let x = drain(); - slog::Logger::root(x, slog_o!()) -} - -#[allow(dead_code)] -pub fn drain() -> slog::Fuse>> -{ - let plain = slog_term::PlainSyncDecorator::new(std::io::stdout()); - let ff = slog_term::FullFormat::new(plain); - - let x = ff - .use_custom_header_print(|_f, _t, r, _x| { - // print format is: dev.branch/{module} {level} {msg} - // module should be cleaned by :: -> / - // level should be colored use termcolor - let module = r.module().replace("::", "/"); - let level = match r.level() { - slog::Level::Critical => termcolor::Color::Red, - slog::Level::Error => termcolor::Color::Red, - slog::Level::Warning => termcolor::Color::Yellow, - slog::Level::Info => termcolor::Color::Green, - slog::Level::Debug => termcolor::Color::Blue, - slog::Level::Trace => termcolor::Color::Cyan, - }; - let location_buffer = PathBuf::from(r.location().file).canonicalize().unwrap(); + fern::Dispatch::new() + .format(move |out, message, record| { + let module = record.target().replace("::", "/"); + let module_color = get_module_color(&module); + let location_buffer = PathBuf::from(record.file().unwrap()) + .canonicalize() + .unwrap_or(record.file().unwrap().into()); let loc = location_buffer.to_str().unwrap(); - let bufwtr = BufferWriter::stderr(ColorChoice::Always); - let mut buffer = bufwtr.buffer(); - let module_color = get_module_colour(&module); - buffer.set_color(ColorSpec::new().set_fg(Some(module_color)))?; - let _ = write!(buffer, "dev.branch/software/ok/{} ", module,); - buffer.reset()?; - buffer.set_color( - ColorSpec::new() - .set_dimmed(true) - .set_underline(true) - .set_fg(Some(Color::White)), - )?; - let _ = write!(buffer, "{}:{}", loc, r.location().line); - buffer.reset()?; - buffer.set_color(ColorSpec::new().set_fg(Some(level)).set_intense(true))?; - let _ = write!(buffer, " {}", r.level()); - buffer.reset()?; - let _ = write!(buffer, " {}", r.msg()); - let _ = bufwtr.print(&buffer); - std::result::Result::Ok(true) + + out.finish(format_args!( + "{} {}:{} {} {}", + format!("{}/{}", "ok.software/", module).color(module_color), + loc, + record.line().unwrap(), + colors.color(record.level()), + message + )) }) - .build() - .fuse(); - x + .level(level) + .chain(io::stdout()) + .apply()?; + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use log::info; + + #[test] + fn test_logging() { + setup_logging(log::LevelFilter::Error).unwrap(); + for var in std::env::vars() { + info!("{}={}", var.0, var.1); + } + } }