diff options
Diffstat (limited to 'third_party/rust/neqo-common/src/log.rs')
-rw-r--r-- | third_party/rust/neqo-common/src/log.rs | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/third_party/rust/neqo-common/src/log.rs b/third_party/rust/neqo-common/src/log.rs new file mode 100644 index 0000000000..0a68acd2d6 --- /dev/null +++ b/third_party/rust/neqo-common/src/log.rs @@ -0,0 +1,105 @@ +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![allow(clippy::module_name_repetitions)] + +use std::io::Write; +use std::sync::Once; +use std::time::Instant; + +#[macro_export] +macro_rules! do_log { + (target: $target:expr, $lvl:expr, $($arg:tt)+) => ({ + let lvl = $lvl; + if lvl <= ::log::max_level() { + ::log::logger().log( + &::log::Record::builder() + .args(format_args!($($arg)+)) + .level(lvl) + .target($target) + .module_path_static(Some(module_path!())) + .file_static(Some(file!())) + .line(Some(line!())) + .build() + ); + } + }); + ($lvl:expr, $($arg:tt)+) => ($crate::do_log!(target: ::log::__log_module_path!(), $lvl, $($arg)+)) +} + +#[macro_export] +macro_rules! log_subject { + ($lvl:expr, $subject:expr) => {{ + if $lvl <= ::log::max_level() { + format!("{}", $subject) + } else { + String::new() + } + }}; +} + +use env_logger::Builder; + +static INIT_ONCE: Once = Once::new(); + +lazy_static! { + static ref START_TIME: Instant = Instant::now(); +} + +pub fn init() { + INIT_ONCE.call_once(|| { + let mut builder = Builder::from_env("RUST_LOG"); + builder.format(|buf, record| { + let elapsed = START_TIME.elapsed(); + writeln!( + buf, + "{}s{:3}ms {} {}", + elapsed.as_secs(), + elapsed.as_millis() % 1000, + record.level(), + record.args() + ) + }); + if let Err(e) = builder.try_init() { + do_log!(::log::Level::Info, "Logging initialization error {:?}", e); + } else { + do_log!(::log::Level::Info, "Logging initialized"); + } + }); +} + +#[macro_export] +macro_rules! log_invoke { + ($lvl:expr, $ctx:expr, $($arg:tt)*) => ( { + ::neqo_common::log::init(); + ::neqo_common::do_log!($lvl, "[{}] {}", $ctx, format!($($arg)*)); + } ) +} +#[macro_export] +macro_rules! qerror { + ([$ctx:expr], $($arg:tt)*) => (::neqo_common::log_invoke!(::log::Level::Error, $ctx, $($arg)*);); + ($($arg:tt)*) => ( { ::neqo_common::log::init(); ::neqo_common::do_log!(::log::Level::Error, $($arg)*); } ); +} +#[macro_export] +macro_rules! qwarn { + ([$ctx:expr], $($arg:tt)*) => (::neqo_common::log_invoke!(::log::Level::Warn, $ctx, $($arg)*);); + ($($arg:tt)*) => ( { ::neqo_common::log::init(); ::neqo_common::do_log!(::log::Level::Warn, $($arg)*); } ); +} +#[macro_export] +macro_rules! qinfo { + ([$ctx:expr], $($arg:tt)*) => (::neqo_common::log_invoke!(::log::Level::Info, $ctx, $($arg)*);); + ($($arg:tt)*) => ( { ::neqo_common::log::init(); ::neqo_common::do_log!(::log::Level::Info, $($arg)*); } ); +} +#[macro_export] +macro_rules! qdebug { + ([$ctx:expr], $($arg:tt)*) => (::neqo_common::log_invoke!(::log::Level::Debug, $ctx, $($arg)*);); + ($($arg:tt)*) => ( { ::neqo_common::log::init(); ::neqo_common::do_log!(::log::Level::Debug, $($arg)*); } ); +} +#[macro_export] +macro_rules! qtrace { + ([$ctx:expr], $($arg:tt)*) => (::neqo_common::log_invoke!(::log::Level::Trace, $ctx, $($arg)*);); + ($($arg:tt)*) => ( { ::neqo_common::log::init(); ::neqo_common::do_log!(::log::Level::Trace, $($arg)*); } ); +} |