From c98b96ef9dd6d1b0354e7222c62325249bc83533 Mon Sep 17 00:00:00 2001 From: xiaofei0800 Date: Wed, 24 Jan 2024 15:41:29 +0800 Subject: [PATCH] tquic_tools support writting log to file. --- interop/run_endpoint.sh | 12 ++++++------ tools/src/bin/tquic_client.rs | 5 +++++ tools/src/bin/tquic_server.rs | 5 +++++ tools/src/common.rs | 19 ++++++++++++++++++- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/interop/run_endpoint.sh b/interop/run_endpoint.sh index 9e70dc75..71dbeed2 100644 --- a/interop/run_endpoint.sh +++ b/interop/run_endpoint.sh @@ -59,7 +59,7 @@ COPA) ;; esac -COMMON_ARGS="--keylog-file $SSLKEYLOGFILE --qlog-dir $QLOG_DIR --log-level TRACE --idle-timeout 30000 --handshake-timeout 30000 --congestion-control-algor $CC_ALGOR" +COMMON_ARGS="--keylog-file $SSLKEYLOGFILE --qlog-dir $QLOG_DIR --log-level TRACE --log-file $LOG_DIR/$ROLE.log --idle-timeout 30000 --handshake-timeout 30000 --congestion-control-algor $CC_ALGOR" if [ "$ROLE" == "client" ]; then # Wait for the simulator to start up. @@ -92,15 +92,15 @@ if [ "$ROLE" == "client" ]; then CLIENT_ARGS="$CLIENT_ARGS --initial-rtt 100" for REQ in $REQUESTS do - $TQUIC_DIR/$TQUIC_CLIENT $CLIENT_ARGS $REQ >> $LOG_DIR/$ROLE.log 2>&1 + $TQUIC_DIR/$TQUIC_CLIENT $CLIENT_ARGS $REQ done ;; zerortt) - $TQUIC_DIR/$TQUIC_CLIENT $CLIENT_ARGS ${REQS[0]} > $LOG_DIR/$ROLE.log 2>&1 - $TQUIC_DIR/$TQUIC_CLIENT $CLIENT_ARGS ${REQS[@]:1} >> $LOG_DIR/$ROLE.log 2>&1 + $TQUIC_DIR/$TQUIC_CLIENT $CLIENT_ARGS ${REQS[0]} + $TQUIC_DIR/$TQUIC_CLIENT $CLIENT_ARGS ${REQS[@]:1} ;; *) - $TQUIC_DIR/$TQUIC_CLIENT $CLIENT_ARGS $REQUESTS > $LOG_DIR/$ROLE.log 2>&1 + $TQUIC_DIR/$TQUIC_CLIENT $CLIENT_ARGS $REQUESTS ;; esac elif [ "$ROLE" == "server" ]; then @@ -118,5 +118,5 @@ elif [ "$ROLE" == "server" ]; then *) ;; esac - $TQUIC_DIR/$TQUIC_SERVER $SERVER_ARGS > $LOG_DIR/$ROLE.log 2>&1 + $TQUIC_DIR/$TQUIC_SERVER $SERVER_ARGS fi diff --git a/tools/src/bin/tquic_client.rs b/tools/src/bin/tquic_client.rs index d09f8fc7..4d4a40d6 100644 --- a/tools/src/bin/tquic_client.rs +++ b/tools/src/bin/tquic_client.rs @@ -121,6 +121,10 @@ pub struct ClientOpt { #[clap(long, default_value = "INFO", value_name = "STR")] pub log_level: log::LevelFilter, + /// Log file path. If no file is specified, logs will be written to `stderr`. + #[clap(long, value_name = "FILE")] + pub log_file: Option, + /// Override server's address. #[clap(short, long, value_name = "ADDR")] pub connect_to: Option, @@ -1406,6 +1410,7 @@ fn parse_option() -> std::result::Result { fn process_option(option: &mut ClientOpt) -> Result<()> { env_logger::builder() + .target(tquic_tools::log_target(&option.log_file)?) .filter_level(option.log_level) .format_timestamp_millis() .init(); diff --git a/tools/src/bin/tquic_server.rs b/tools/src/bin/tquic_server.rs index 8a8c12d3..936424f9 100644 --- a/tools/src/bin/tquic_server.rs +++ b/tools/src/bin/tquic_server.rs @@ -71,6 +71,10 @@ pub struct ServerOpt { #[clap(long, default_value = "INFO")] pub log_level: log::LevelFilter, + /// Log file path. If no file is specified, logs will be written to `stderr`. + #[clap(long, value_name = "FILE")] + pub log_file: Option, + /// Address to listen. #[clap(short, long, default_value = "0.0.0.0:4433", value_name = "ADDR")] pub listen: SocketAddr, @@ -766,6 +770,7 @@ impl TransportHandler for ServerHandler { fn process_option(option: &mut ServerOpt) -> Result<()> { env_logger::builder() + .target(tquic_tools::log_target(&option.log_file)?) .filter_level(option.log_level) .format_timestamp_millis() .init(); diff --git a/tools/src/common.rs b/tools/src/common.rs index 229929d9..05dbcc8b 100644 --- a/tools/src/common.rs +++ b/tools/src/common.rs @@ -20,7 +20,8 @@ use std::net::SocketAddr; use clap::builder::PossibleValue; use clap::ValueEnum; -use log::debug; +use env_logger::Target; +use log::*; use mio::net::UdpSocket; use mio::Interest; use mio::Registry; @@ -222,3 +223,19 @@ impl PacketSendHandler for QuicSocket { Ok(count) } } + +/// Get the target for the log output. +pub fn log_target(log_file: &Option) -> Result { + if let Some(log_file) = log_file { + if let Ok(file) = std::fs::OpenOptions::new() + .create(true) + .append(true) + .open(log_file) + { + return Ok(Target::Pipe(Box::new(file))); + } + return Err(format!("create log file {:?} failed", log_file).into()); + } + + Ok(Target::Stderr) +}