From 2b7d824714cf620cccba61ce072f11c51140bd2a Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Sat, 11 Jul 2020 11:35:27 +1200 Subject: [PATCH] Use a tracing EnvFilter directive for -debug flags --- Cargo.lock | 64 ++++++++++++++++++++++++ Cargo.toml | 2 +- depends/packages/crate_aho_corasick.mk | 15 ++++++ depends/packages/crate_matchers.mk | 15 ++++++ depends/packages/crate_memchr.mk | 15 ++++++ depends/packages/crate_regex.mk | 15 ++++++ depends/packages/crate_regex_automata.mk | 15 ++++++ depends/packages/crate_regex_syntax.mk | 15 ++++++ depends/packages/crate_thread_local.mk | 15 ++++++ depends/packages/packages.mk | 7 +++ src/init.cpp | 9 ++-- src/rust/include/tracing.h | 1 + src/rust/src/tracing_ffi.rs | 22 ++++++-- src/util.cpp | 19 +++++++ src/util.h | 20 ++++---- 15 files changed, 230 insertions(+), 19 deletions(-) create mode 100644 depends/packages/crate_aho_corasick.mk create mode 100644 depends/packages/crate_matchers.mk create mode 100644 depends/packages/crate_memchr.mk create mode 100644 depends/packages/crate_regex.mk create mode 100644 depends/packages/crate_regex_automata.mk create mode 100644 depends/packages/crate_regex_syntax.mk create mode 100644 depends/packages/crate_thread_local.mk diff --git a/Cargo.lock b/Cargo.lock index 624f2c85c..53510520d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -32,6 +32,15 @@ dependencies = [ "opaque-debug", ] +[[package]] +name = "aho-corasick" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86" +dependencies = [ + "memchr", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -500,6 +509,21 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "memchr" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" + [[package]] name = "memoffset" version = "0.5.1" @@ -646,6 +670,34 @@ dependencies = [ "rand_core", ] +[[package]] +name = "regex" +version = "1.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-automata" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" +dependencies = [ + "byteorder", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" + [[package]] name = "rustc_version" version = "0.2.3" @@ -754,6 +806,15 @@ dependencies = [ "syn", ] +[[package]] +name = "thread_local" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +dependencies = [ + "lazy_static", +] + [[package]] name = "time" version = "0.1.43" @@ -814,6 +875,9 @@ checksum = "f7b33f8b2ef2ab0c3778c12646d9c42a24f7772bee4cdafc72199644a9f58fdc" dependencies = [ "ansi_term", "chrono", + "lazy_static", + "matchers", + "regex", "sharded-slab", "tracing-core", ] diff --git a/Cargo.toml b/Cargo.toml index 172e49029..ddb7e4d69 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,7 +39,7 @@ ed25519-zebra = "2.0.0" [dependencies.tracing-subscriber] version = "0.2" default-features = false -features = ["ansi", "chrono"] +features = ["ansi", "chrono", "env-filter"] [profile.release] lto = true diff --git a/depends/packages/crate_aho_corasick.mk b/depends/packages/crate_aho_corasick.mk new file mode 100644 index 000000000..03cbc8996 --- /dev/null +++ b/depends/packages/crate_aho_corasick.mk @@ -0,0 +1,15 @@ +package=crate_aho_corasick +$(package)_crate_name=aho-corasick +$(package)_version=0.7.13 +$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name) +$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate +$(package)_sha256_hash=043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86 +$(package)_crate_versioned_name=$($(package)_crate_name) + +define $(package)_preprocess_cmds + $(call generate_crate_checksum,$(package)) +endef + +define $(package)_stage_cmds + $(call vendor_crate_source,$(package)) +endef diff --git a/depends/packages/crate_matchers.mk b/depends/packages/crate_matchers.mk new file mode 100644 index 000000000..61f968fcc --- /dev/null +++ b/depends/packages/crate_matchers.mk @@ -0,0 +1,15 @@ +package=crate_matchers +$(package)_crate_name=matchers +$(package)_version=0.0.1 +$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name) +$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate +$(package)_sha256_hash=f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1 +$(package)_crate_versioned_name=$($(package)_crate_name) + +define $(package)_preprocess_cmds + $(call generate_crate_checksum,$(package)) +endef + +define $(package)_stage_cmds + $(call vendor_crate_source,$(package)) +endef diff --git a/depends/packages/crate_memchr.mk b/depends/packages/crate_memchr.mk new file mode 100644 index 000000000..8d318f5d6 --- /dev/null +++ b/depends/packages/crate_memchr.mk @@ -0,0 +1,15 @@ +package=crate_memchr +$(package)_crate_name=memchr +$(package)_version=2.3.3 +$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name) +$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate +$(package)_sha256_hash=3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400 +$(package)_crate_versioned_name=$($(package)_crate_name) + +define $(package)_preprocess_cmds + $(call generate_crate_checksum,$(package)) +endef + +define $(package)_stage_cmds + $(call vendor_crate_source,$(package)) +endef diff --git a/depends/packages/crate_regex.mk b/depends/packages/crate_regex.mk new file mode 100644 index 000000000..e801eae51 --- /dev/null +++ b/depends/packages/crate_regex.mk @@ -0,0 +1,15 @@ +package=crate_regex +$(package)_crate_name=regex +$(package)_version=1.3.9 +$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name) +$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate +$(package)_sha256_hash=9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6 +$(package)_crate_versioned_name=$($(package)_crate_name) + +define $(package)_preprocess_cmds + $(call generate_crate_checksum,$(package)) +endef + +define $(package)_stage_cmds + $(call vendor_crate_source,$(package)) +endef diff --git a/depends/packages/crate_regex_automata.mk b/depends/packages/crate_regex_automata.mk new file mode 100644 index 000000000..3a577b18b --- /dev/null +++ b/depends/packages/crate_regex_automata.mk @@ -0,0 +1,15 @@ +package=crate_regex_automata +$(package)_crate_name=regex-automata +$(package)_version=0.1.9 +$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name) +$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate +$(package)_sha256_hash=ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4 +$(package)_crate_versioned_name=$($(package)_crate_name) + +define $(package)_preprocess_cmds + $(call generate_crate_checksum,$(package)) +endef + +define $(package)_stage_cmds + $(call vendor_crate_source,$(package)) +endef diff --git a/depends/packages/crate_regex_syntax.mk b/depends/packages/crate_regex_syntax.mk new file mode 100644 index 000000000..afa390e00 --- /dev/null +++ b/depends/packages/crate_regex_syntax.mk @@ -0,0 +1,15 @@ +package=crate_regex_syntax +$(package)_crate_name=regex-syntax +$(package)_version=0.6.18 +$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name) +$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate +$(package)_sha256_hash=26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8 +$(package)_crate_versioned_name=$($(package)_crate_name) + +define $(package)_preprocess_cmds + $(call generate_crate_checksum,$(package)) +endef + +define $(package)_stage_cmds + $(call vendor_crate_source,$(package)) +endef diff --git a/depends/packages/crate_thread_local.mk b/depends/packages/crate_thread_local.mk new file mode 100644 index 000000000..9a164f0e4 --- /dev/null +++ b/depends/packages/crate_thread_local.mk @@ -0,0 +1,15 @@ +package=crate_thread_local +$(package)_crate_name=thread_local +$(package)_version=1.0.1 +$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name) +$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate +$(package)_sha256_hash=d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14 +$(package)_crate_versioned_name=$($(package)_crate_name) + +define $(package)_preprocess_cmds + $(call generate_crate_checksum,$(package)) +endef + +define $(package)_stage_cmds + $(call vendor_crate_source,$(package)) +endef diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 9357d0af6..e1fb4d66d 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -2,6 +2,7 @@ rust_crates := \ crate_aes \ crate_aesni \ crate_aes_soft \ + crate_aho_corasick \ crate_ansi_term \ crate_arrayref \ crate_arrayvec \ @@ -50,6 +51,8 @@ rust_crates := \ crate_lazy_static \ crate_libc \ crate_log \ + crate_matchers \ + crate_memchr \ crate_memoffset \ crate_nodrop \ crate_num_bigint \ @@ -66,6 +69,9 @@ rust_crates := \ crate_rand_hc \ crate_rand_xorshift \ crate_rand \ + crate_regex_automata \ + crate_regex_syntax \ + crate_regex \ crate_rustc_version \ crate_scopeguard \ crate_semver_parser \ @@ -79,6 +85,7 @@ rust_crates := \ crate_time \ crate_thiserror \ crate_thiserror_impl \ + crate_thread_local \ crate_tracing_appender \ crate_tracing_attributes \ crate_tracing_core \ diff --git a/src/init.cpp b/src/init.cpp index a82f74a9f..36947cb59 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -806,16 +806,19 @@ void InitLogging() fLogTimestamps = GetBoolArg("-logtimestamps", DEFAULT_LOGTIMESTAMPS); fLogIPs = GetBoolArg("-logips", DEFAULT_LOGIPS); + // Set up the initial filtering directive from the -debug flags. + std::string initialFilter = LogConfigFilter(); + if (fPrintToConsole) { - pTracingHandle = tracing_init(nullptr, 0, fLogTimestamps); + pTracingHandle = tracing_init(nullptr, 0, initialFilter.c_str(), fLogTimestamps); } else { boost::filesystem::path pathDebug = GetDebugLogPath(); auto pathDebugStr = pathDebug.native(); pTracingHandle = tracing_init( reinterpret_cast(pathDebugStr.c_str()), pathDebugStr.length(), - fLogTimestamps - ); + initialFilter.c_str(), + fLogTimestamps); } LogPrintf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); diff --git a/src/rust/include/tracing.h b/src/rust/include/tracing.h index 4be770ca2..3038c11d9 100644 --- a/src/rust/include/tracing.h +++ b/src/rust/include/tracing.h @@ -26,6 +26,7 @@ typedef struct TracingHandle TracingHandle; TracingHandle* tracing_init( const codeunit* log_path, size_t log_path_len, + const char* initial_filter, bool log_timestamps); /// Frees a tracing handle returned from `tracing_init`; diff --git a/src/rust/src/tracing_ffi.rs b/src/rust/src/tracing_ffi.rs index 240df28bf..4371fe6fb 100644 --- a/src/rust/src/tracing_ffi.rs +++ b/src/rust/src/tracing_ffi.rs @@ -34,10 +34,15 @@ pub extern "C" fn tracing_init( #[cfg(not(target_os = "windows"))] log_path: *const u8, #[cfg(target_os = "windows")] log_path: *const u16, log_path_len: usize, + initial_filter: *const c_char, log_timestamps: bool, ) -> *mut TracingHandle { + let initial_filter = unsafe { CStr::from_ptr(initial_filter) } + .to_str() + .expect("initial filter should be a valid string"); + if log_path.is_null() { - tracing_init_stdout(log_timestamps) + tracing_init_stdout(initial_filter, log_timestamps) } else { let log_path = unsafe { slice::from_raw_parts(log_path, log_path_len) }; @@ -47,12 +52,14 @@ pub extern "C" fn tracing_init( #[cfg(target_os = "windows")] let log_path = Path::new(OsString::from_wide(log_path)); - tracing_init_file(log_path, log_timestamps) + tracing_init_file(log_path, initial_filter, log_timestamps) } } -fn tracing_init_stdout(log_timestamps: bool) -> *mut TracingHandle { - let builder = tracing_subscriber::fmt().with_ansi(true); +fn tracing_init_stdout(initial_filter: &str, log_timestamps: bool) -> *mut TracingHandle { + let builder = tracing_subscriber::fmt() + .with_ansi(true) + .with_env_filter(initial_filter); if log_timestamps { builder.init(); @@ -63,13 +70,18 @@ fn tracing_init_stdout(log_timestamps: bool) -> *mut TracingHandle { Box::into_raw(Box::new(TracingHandle { _file_guard: None })) } -fn tracing_init_file(log_path: &Path, log_timestamps: bool) -> *mut TracingHandle { +fn tracing_init_file( + log_path: &Path, + initial_filter: &str, + log_timestamps: bool, +) -> *mut TracingHandle { let file_appender = tracing_appender::rolling::never(log_path.parent().unwrap(), log_path.file_name().unwrap()); let (non_blocking, file_guard) = tracing_appender::non_blocking(file_appender); let builder = tracing_subscriber::fmt() .with_ansi(false) + .with_env_filter(initial_filter) .with_writer(non_blocking); if log_timestamps { diff --git a/src/util.cpp b/src/util.cpp index cb7f64f3c..e84e7e6a5 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -221,6 +221,25 @@ boost::filesystem::path GetDebugLogPath() } } +std::string LogConfigFilter() +{ + // With no -debug flags, show errors and LogPrintf lines. + std::string filter = "error,main=info"; + + auto& categories = mapMultiArgs["-debug"]; + std::set setCategories(categories.begin(), categories.end()); + if (setCategories.count(string("")) != 0 || setCategories.count(string("1")) != 0) { + // Turn on the firehose! + filter = "info"; + } else { + for (auto category : setCategories) { + filter += "," + category + "=info"; + } + } + + return filter; +} + bool LogAcceptCategory(const char* category) { if (category != NULL) diff --git a/src/util.h b/src/util.h index 26be2a328..60e7dd258 100644 --- a/src/util.h +++ b/src/util.h @@ -74,22 +74,22 @@ inline std::string _(const char* psz) void SetupEnvironment(); bool SetupNetworking(); +/** Returns the filtering directive set by the -debug flags. */ +std::string LogConfigFilter(); /** Return true if log accepts specified category */ bool LogAcceptCategory(const char* category); #define LogPrintf(...) LogPrint(NULL, __VA_ARGS__) /** Print to debug.log if -debug=category switch is given OR category is NULL. */ -#define LogPrint(category, ...) do { \ - if (LogAcceptCategory(category)) { \ - std::string T_MSG = tfm::format(__VA_ARGS__); \ - if (!T_MSG.empty() && T_MSG[T_MSG.size()-1] == '\n') { \ - T_MSG.erase(T_MSG.size()-1); \ - } \ - TracingInfo( \ - category == NULL ? "main" : category, \ - T_MSG.c_str()); \ - } \ +#define LogPrint(category, ...) do { \ + std::string T_MSG = tfm::format(__VA_ARGS__); \ + if (!T_MSG.empty() && T_MSG[T_MSG.size()-1] == '\n') { \ + T_MSG.erase(T_MSG.size()-1); \ + } \ + TracingInfo( \ + category == NULL ? "main" : category, \ + T_MSG.c_str()); \ } while(0) #define LogError(category, ...) ([&]() { \