summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorEmīls Piņķis <emils@mullvad.net>2018-04-12 14:38:38 +0100
committerEmīls Piņķis <emils@mullvad.net>2018-04-13 09:59:01 +0100
commit8c7b0a8bfaf904d95636ebb00384ac00a0fdd240 (patch)
treedf73646cb066b679b43efec907e28e17e1883a0d
parent8931fd7611bf900d921ad08092971c44be8136f4 (diff)
downloadmullvadvpn-8c7b0a8bfaf904d95636ebb00384ac00a0fdd240.tar.xz
mullvadvpn-8c7b0a8bfaf904d95636ebb00384ac00a0fdd240.zip
Add flag to allow not printing timestamps to stdout
-rw-r--r--CHANGELOG.md1
-rw-r--r--mullvad-daemon/src/cli.rs8
-rw-r--r--mullvad-daemon/src/logging.rs71
-rw-r--r--mullvad-daemon/src/main.rs7
4 files changed, 62 insertions, 25 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 497c50c1af..a5a61ddbbf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -35,6 +35,7 @@ Line wrap the file at 100 chars. Th
- Daemon now fetches latest app versions and verifies whether the current
version is supported.
- Add `version` subcommand in the CLI to show information about current versions.
+- Add a flag to daemon to print log entries to standard output without timestamps.
### Changed
- Change all occurrences of "MullvadVPN" into "Mullvad VPN", this affects
diff --git a/mullvad-daemon/src/cli.rs b/mullvad-daemon/src/cli.rs
index 8867e42ca2..f3c5773912 100644
--- a/mullvad-daemon/src/cli.rs
+++ b/mullvad-daemon/src/cli.rs
@@ -11,6 +11,7 @@ pub struct Config {
pub tunnel_log_file: Option<PathBuf>,
pub resource_dir: Option<PathBuf>,
pub require_auth: bool,
+ pub log_stdout_timestamps: bool,
}
pub fn get_config() -> Config {
@@ -26,6 +27,7 @@ pub fn get_config() -> Config {
let tunnel_log_file = matches.value_of_os("tunnel_log_file").map(PathBuf::from);
let resource_dir = matches.value_of_os("resource_dir").map(PathBuf::from);
let require_auth = !matches.is_present("disable_rpc_auth");
+ let log_stdout_timestamps = !matches.is_present("disable_stdout_timestamps");
Config {
log_level,
@@ -33,6 +35,7 @@ pub fn get_config() -> Config {
tunnel_log_file,
resource_dir,
require_auth,
+ log_stdout_timestamps,
}
}
@@ -73,4 +76,9 @@ fn create_app() -> App<'static, 'static> {
.long("disable-rpc-auth")
.help("Don't require authentication on the RPC management interface."),
)
+ .arg(
+ Arg::with_name("disable_stdout_timestamps")
+ .long("disable-stdout-timestamps")
+ .help("Don't log timestamps when logging to stdout, useful when running as a systemd service")
+ )
}
diff --git a/mullvad-daemon/src/logging.rs b/mullvad-daemon/src/logging.rs
index a43b00524a..caac15d02a 100644
--- a/mullvad-daemon/src/logging.rs
+++ b/mullvad-daemon/src/logging.rs
@@ -40,24 +40,36 @@ const COLORS: ColoredLevelConfig = ColoredLevelConfig {
trace: Color::Black,
};
-pub const DATE_TIME_FORMAT_STR: &str = "%Y-%m-%d %H:%M:%S%.3f";
+pub const DATE_TIME_FORMAT_STR: &str = "[%Y-%m-%d %H:%M:%S%.3f]";
-pub fn init_logger(log_level: log::LevelFilter, log_file: Option<&PathBuf>) -> Result<()> {
+pub fn init_logger(
+ log_level: log::LevelFilter,
+ log_file: Option<&PathBuf>,
+ output_timestamp: bool,
+) -> Result<()> {
let mut top_dispatcher = fern::Dispatch::new().level(log_level);
for silenced_crate in SILENCED_CRATES {
top_dispatcher = top_dispatcher.level_for(*silenced_crate, log::LevelFilter::Warn);
}
+ let stdout_formatter = Formatter {
+ output_timestamp: output_timestamp,
+ output_color: true,
+ };
let stdout_dispatcher = fern::Dispatch::new()
- .format(move |out, message, record| format_log_message(out, message, record, true))
+ .format(move |out, message, record| stdout_formatter.output_msg(out, message, record))
.chain(io::stdout());
top_dispatcher = top_dispatcher.chain(stdout_dispatcher);
if let Some(ref log_file) = log_file {
+ let file_formatter = Formatter {
+ output_timestamp: true,
+ output_color: false,
+ };
let f = fern::log_file(log_file)
.chain_err(|| ErrorKind::WriteFileError(log_file.to_path_buf()))?;
let file_dispatcher = fern::Dispatch::new()
- .format(|out, message, record| format_log_message(out, message, record, false))
+ .format(move |out, message, record| file_formatter.output_msg(out, message, record))
.chain(f);
top_dispatcher = top_dispatcher.chain(file_dispatcher);
}
@@ -65,28 +77,41 @@ pub fn init_logger(log_level: log::LevelFilter, log_file: Option<&PathBuf>) -> R
Ok(())
}
-fn format_log_message(
- out: fern::FormatCallback,
- message: &fmt::Arguments,
- record: &log::Record,
- color_output: bool,
-) {
- let timestamp = chrono::Local::now().format(DATE_TIME_FORMAT_STR);
- if color_output && cfg!(not(windows)) {
+#[derive(Default, Debug)]
+struct Formatter {
+ pub output_timestamp: bool,
+ pub output_color: bool,
+}
+
+impl Formatter {
+ fn get_timetsamp_fmt(&self) -> &str {
+ if self.output_timestamp {
+ DATE_TIME_FORMAT_STR
+ } else {
+ &""
+ }
+ }
+
+ fn get_record_level(&self, level: log::Level) -> Box<fmt::Display> {
+ if self.output_color && cfg!(not(windows)) {
+ Box::new(COLORS.color(level))
+ } else {
+ Box::new(level)
+ }
+ }
+
+ pub fn output_msg(
+ &self,
+ out: fern::FormatCallback,
+ message: &fmt::Arguments,
+ record: &log::Record,
+ ) {
out.finish(format_args!(
- "[{}][{}][{}] {}",
- timestamp,
+ "{}[{}][{}] {}",
+ chrono::Local::now().format(self.get_timetsamp_fmt()),
record.target(),
- COLORS.color(record.level()),
+ self.get_record_level(record.level()),
message,
))
- } else {
- out.finish(format_args!(
- "[{}][{}][{}] {}",
- timestamp,
- record.target(),
- record.level(),
- message
- ))
}
}
diff --git a/mullvad-daemon/src/main.rs b/mullvad-daemon/src/main.rs
index e81b99e40e..9594448a74 100644
--- a/mullvad-daemon/src/main.rs
+++ b/mullvad-daemon/src/main.rs
@@ -849,8 +849,11 @@ quick_main!(run);
fn run() -> Result<()> {
let config = cli::get_config();
- logging::init_logger(config.log_level, config.log_file.as_ref())
- .chain_err(|| "Unable to initialize logger")?;
+ logging::init_logger(
+ config.log_level,
+ config.log_file.as_ref(),
+ config.log_stdout_timestamps,
+ ).chain_err(|| "Unable to initialize logger")?;
log_version();
if !running_as_admin() {