Allow setting Visual Studio logger level from cli arg

This commit is contained in:
Fernando Jimenez Moreno 2019-10-28 17:29:20 +01:00
parent 0c20fba2ab
commit e1b6719384
3 changed files with 31 additions and 18 deletions

View file

@ -728,6 +728,7 @@ pub fn from_cmdline_args(mut opts: Options, args: &[String]) -> ArgumentParsingR
opts.optopt("", "profiler-db-pass", "Profiler database password", "");
opts.optopt("", "profiler-db-name", "Profiler database name", "");
opts.optflag("", "print-pwm", "Print Progressive Web Metrics");
opts.optopt("", "vslogger-level", "Visual Studio logger level", "Warn");
let opt_match = match opts.parse(args) {
Ok(m) => m,

View file

@ -14,6 +14,7 @@ mod vslogger;
use backtrace::Backtrace;
#[cfg(not(target_os = "windows"))]
use env_logger;
use log::LevelFilter;
use simpleservo::{self, gl_glue, ServoGlue, SERVO};
use simpleservo::{Coordinates, EventLoopWaker, HostTrait, InitOptions, VRInitOptions};
use std::ffi::{CStr, CString};
@ -22,6 +23,7 @@ use std::mem;
use std::os::raw::{c_char, c_void};
use std::panic::{self, UnwindSafe};
use std::slice;
use std::str::FromStr;
use std::sync::RwLock;
extern "C" fn default_panic_handler(msg: *const c_char) {
@ -234,9 +236,8 @@ pub extern "C" fn servo_version() -> *const c_char {
}
#[cfg(target_os = "windows")]
fn init_logger(modules: &[*const c_char]) {
fn init_logger(modules: &[*const c_char], level: LevelFilter) {
use crate::vslogger::LOG_MODULE_FILTERS;
use log::LevelFilter;
use std::sync::Once;
use vslogger::VSLogger;
@ -252,13 +253,13 @@ fn init_logger(modules: &[*const c_char]) {
LOGGER_INIT.call_once(|| {
log::set_logger(&LOGGER)
.map(|_| log::set_max_level(LevelFilter::Debug))
.map(|_| log::set_max_level(level))
.unwrap();
});
}
#[cfg(not(target_os = "windows"))]
fn init_logger(_modules: &[*const c_char]) {
fn init_logger(_modules: &[*const c_char], _level: LevelFilter) {
crate::env_logger::init();
}
@ -270,18 +271,6 @@ unsafe fn init(
wakeup: extern "C" fn(),
callbacks: CHostCallbacks,
) {
let logger_modules = if opts.vslogger_mod_list.is_null() {
&[]
} else {
slice::from_raw_parts(opts.vslogger_mod_list, opts.vslogger_mod_size as usize)
};
init_logger(logger_modules);
if let Err(reason) = redirect_stdout_stderr() {
warn!("Error redirecting stdout/stderr: {}", reason);
}
let args = if !opts.args.is_null() {
let args = CStr::from_ptr(opts.args);
args.to_str()
@ -293,6 +282,29 @@ unsafe fn init(
vec![]
};
let logger_level = if let Some(level_index) = args.iter().position(|s| s == "--vslogger-level")
{
if args.len() >= level_index + 1 {
LevelFilter::from_str(&args[level_index + 1]).unwrap_or(LevelFilter::Warn)
} else {
LevelFilter::Warn
}
} else {
LevelFilter::Warn
};
let logger_modules = if opts.vslogger_mod_list.is_null() {
&[]
} else {
slice::from_raw_parts(opts.vslogger_mod_list, opts.vslogger_mod_size as usize)
};
init_logger(logger_modules, logger_level);
if let Err(reason) = redirect_stdout_stderr() {
warn!("Error redirecting stdout/stderr: {}", reason);
}
let url = CStr::from_ptr(opts.url);
let url = url.to_str().map(|s| s.to_string()).ok();

View file

@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use log::{self, Level, Metadata, Record};
use log::{self, Metadata, Record};
use std::sync::{Arc, Mutex};
lazy_static! {
@ -20,7 +20,7 @@ impl log::Log for VSLogger {
let modules = LOG_MODULE_FILTERS.lock().unwrap();
let is_module_enabled =
modules.contains(&String::from(metadata.target())) || modules.is_empty();
return metadata.level() <= Level::Warn && is_module_enabled;
return is_module_enabled;
}
fn log(&self, record: &Record) {