From 07e7f19a9d64d15a15c574d0f695944a0fc7b4bc Mon Sep 17 00:00:00 2001 From: naderzare Date: Mon, 30 Sep 2024 21:43:40 -0300 Subject: [PATCH 1/4] improve logger --- server.py | 50 ++++++++++++++++++++++++++++--------------- start-team.py | 30 ++++++++++++++++++-------- start-team.sh | 13 ++++++++++- utils/logger_utils.py | 50 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 27 deletions(-) create mode 100644 utils/logger_utils.py diff --git a/server.py b/server.py index beb4f08..ab681f2 100644 --- a/server.py +++ b/server.py @@ -15,9 +15,13 @@ import logging from pyrusgeom.vector_2d import Vector2D import argparse +from utils.logger_utils import setup_logger -logging.basicConfig(level=logging.DEBUG) +console_logging_level = logging.INFO +file_logging_level = logging.DEBUG + +main_logger = setup_logger("pmservice", "logs/pmservice.log", console_level=console_logging_level, file_level=file_logging_level) class GameHandler: @@ -28,9 +32,11 @@ def __init__(self, shared_lock, shared_number_of_connections): self.debug_mode: bool = False self.shared_lock = shared_lock self.shared_number_of_connections = shared_number_of_connections + self.logger: logging.Logger = setup_logger("Agent", "logs/Agent.log", console_level=console_logging_level, file_level=file_logging_level) def GetPlayerActions(self, state: State): - logging.debug(f"GetPlayerActions unum {state.register_response.uniform_number} at {state.world_model.cycle}") + self.logger.debug(f"================================= cycle={state.world_model.cycle}.{state.world_model.stoped_cycle} =================================") + self.logger.debug(f"GetPlayerActions unum {state.register_response.uniform_number} at {state.world_model.cycle}") actions = [] if state.world_model.game_mode_type == GameModeType.PlayOn: if state.world_model.myself.is_goalie: @@ -53,19 +59,24 @@ def GetPlayerActions(self, state: State): actions.append(PlayerAction(helios_set_play=HeliosSetPlay())) res = PlayerActions(actions=actions) + self.logger.debug(f"Actions: {res}") return res def GetCoachActions(self, state: State): - logging.debug(f"GetCoachActions coach at {state.world_model.cycle}") + self.logger.debug(f"================================= cycle={state.world_model.cycle}.{state.world_model.stoped_cycle} =================================") + self.logger.debug(f"GetCoachActions coach at {state.world_model.cycle}") actions = [] actions.append(CoachAction(do_helios_substitute=DoHeliosSubstitute())) - return CoachActions(actions=actions) + res = CoachActions(actions=actions) + self.logger.debug(f"Actions: {res}") + return res def GetTrainerActions(self, state: State): - logging.debug(f"GetTrainerActions trainer at {state.world_model.cycle}") + self.logger.debug(f"================================= cycle={state.world_model.cycle}.{state.world_model.stoped_cycle} =================================") + self.logger.debug(f"GetTrainerActions trainer at {state.world_model.cycle}") actions = [] if state.world_model.cycle % 100 == 99: - logging.debug(f"Trainer at cycle {state.world_model.cycle}") + self.logger.debug(f"Trainer at cycle {state.world_model.cycle}") if len(state.world_model.teammates) == 0: return TrainerActions() player = state.world_model.teammates[0] @@ -95,42 +106,47 @@ def GetTrainerActions(self, state: State): )), TrainerAction(do_change_mode=DoChangeMode(game_mode_type=GameModeType.PlayOn)) ] - return TrainerActions(actions=actions) + res = TrainerActions(actions=actions) + self.logger.debug(f"Actions: {res}") + return res def SendServerParams(self, serverParams: ServerParam): - logging.debug(f"Server params received unum {serverParams.register_response.uniform_number}") + self.logger.debug(f"Server params received unum {serverParams.register_response.uniform_number}") self.server_params = serverParams res = Empty() return res def SendPlayerParams(self, playerParams: PlayerParam): - logging.debug(f"Player params received unum {playerParams.register_response.uniform_number}") + self.logger.debug(f"Player params received unum {playerParams.register_response.uniform_number}") self.player_params = playerParams res = Empty() return res def SendPlayerType(self, playerType: PlayerType): - logging.debug(f"Player type received unum {playerType.register_response.uniform_number}") + self.logger.debug(f"Player type received unum {playerType.register_response.uniform_number}") self.player_types[playerType.id] = playerType res = Empty() return res def SendInitMessage(self, initMessage: InitMessage): - logging.debug(f"Init message received unum {initMessage.register_response.uniform_number}") + self.logger.debug(f"Init message received unum {initMessage.register_response.uniform_number}") self.debug_mode = initMessage.debug_mode res = Empty() return res def Register(self, register_request: RegisterRequest): - logging.debug(f"received register request from team_name: {register_request.team_name} " + self.logger.debug(f"received register request from team_name: {register_request.team_name} " f"unum: {register_request.uniform_number} " f"agent_type: {register_request.agent_type}") with self.shared_lock: self.shared_number_of_connections.value += 1 - logging.debug(f"Number of connections {self.shared_number_of_connections.value}") + self.logger.debug(f"Number of connections {self.shared_number_of_connections.value}") team_name = register_request.team_name uniform_number = register_request.uniform_number agent_type = register_request.agent_type + self.logger: logging.Logger = setup_logger(f"Agent{register_request.uniform_number}-{self.shared_number_of_connections.value}", + "logs/Agent{register_request.uniform_number}-{self.shared_number_of_connections.value}.log", + console_level=console_logging_level, file_level=file_logging_level) res = RegisterResponse(client_id=self.shared_number_of_connections.value, team_name=team_name, uniform_number=uniform_number, @@ -138,17 +154,17 @@ def Register(self, register_request: RegisterRequest): return res def SendByeCommand(self, register_response: RegisterResponse): - logging.debug(f"Bye command received unum {register_response.uniform_number}") + self.logger.debug(f"Bye command received unum {register_response.uniform_number}") with self.shared_lock: pass res = Empty() return res def GetBestPlannerAction(self, pairs: BestPlannerActionRequest): - logging.debug(f"GetBestPlannerAction cycle:{pairs.state.world_model.cycle} pairs:{len(pairs.pairs)} unum:{pairs.register_response.uniform_number}") + self.logger.debug(f"GetBestPlannerAction cycle:{pairs.state.world_model.cycle} pairs:{len(pairs.pairs)} unum:{pairs.register_response.uniform_number}") pairs_list: list[int, RpcActionState] = [(k, v) for k, v in pairs.pairs.items()] pairs_list.sort(key=lambda x: x[0]) best_action = max(pairs_list, key=lambda x: -1000 if x[1].action.parent_index != -1 else x[1].predict_state.ball_position.x) - logging.debug(f"Best action: {best_action[0]} {best_action[1].action.description} to {best_action[1].action.target_unum} in ({round(best_action[1].action.target_point.x, 2)},{round(best_action[1].action.target_point.y, 2)}) e:{round(best_action[1].evaluation,2)}") + self.logger.debug(f"Best action: {best_action[0]} {best_action[1].action.description} to {best_action[1].action.target_unum} in ({round(best_action[1].action.target_point.x, 2)},{round(best_action[1].action.target_point.y, 2)}) e:{round(best_action[1].evaluation,2)}") res = BestPlannerActionResponse(index=best_action[0]) return res @@ -162,7 +178,7 @@ def serve(port, shared_lock, shared_number_of_connections): server = PFProcessServer(processor, transport, tfactory, pfactory) # server = TThreadedServer(processor, transport, tfactory, pfactory) - logging.info(f"Starting server on port {port}") + main_logger.info(f"Starting server on port {port}") try: server.serve() except KeyboardInterrupt: diff --git a/start-team.py b/start-team.py index 5fd4fd4..1135c4b 100644 --- a/start-team.py +++ b/start-team.py @@ -5,10 +5,14 @@ import logging import argparse import check_requirements +from utils.logger_utils import setup_logger +# remove logs directory +os.system("rm -rf logs") # Set up logging -logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') +start_team_logger = setup_logger('start-team', 'logs/start-team.log', console_level=logging.DEBUG, file_level=logging.DEBUG, console_format_str='%(message)s') + def run_server_script(args): # Start the server.py script as a new process group @@ -31,10 +35,18 @@ def run_start_script(args): ) return process -def stream_output(process, prefix): +def stream_output_to_console(process, prefix): + # Stream output from the process and log it with a prefix + for line in iter(process.stdout.readline, b''): + start_team_logger.debug(f'{prefix} {line.decode().strip()}') + process.stdout.close() + +def stream_output_to_file(process, prefix): # Stream output from the process and log it with a prefix + logger = setup_logger(prefix, console_level=None, file_level=logging.DEBUG) for line in iter(process.stdout.readline, b''): - logging.debug(f'{prefix} {line.decode().strip()}') + logger.info(line.decode().strip()) + pass process.stdout.close() def kill_process_group(process): @@ -52,20 +64,20 @@ def kill_process_group(process): try: # Check Python requirements - logging.debug("Checking Python requirements...") + start_team_logger.debug("Checking Python requirements...") check_requirements.check_requirements() # Run the server.py script first server_process = run_server_script(args) - logging.debug(f"Started server.py process with PID: {server_process.pid}") + start_team_logger.debug(f"Started server.py process with PID: {server_process.pid}") # Run the start.sh script after server.py with the given arguments start_process = run_start_script(args) - logging.debug(f"Started start.sh process with PID: {start_process.pid} with team name {args=}") + start_team_logger.debug(f"Started start.sh process with PID: {start_process.pid} with team name {args=}") # Monitor both processes and log their outputs - server_thread = threading.Thread(target=stream_output, args=(server_process, 'server:')) - start_thread = threading.Thread(target=stream_output, args=(start_process, 'team:')) + server_thread = threading.Thread(target=stream_output_to_console, args=(server_process, 'server:')) + start_thread = threading.Thread(target=stream_output_to_file, args=(start_process, 'proxy:')) server_thread.start() start_thread.start() @@ -75,7 +87,7 @@ def kill_process_group(process): start_thread.join() except KeyboardInterrupt: - logging.debug("Interrupted! Killing all processes.") + start_team_logger.debug("Interrupted! Killing all processes.") kill_process_group(server_process) kill_process_group(start_process) diff --git a/start-team.sh b/start-team.sh index 7a15503..5ae5d09 100755 --- a/start-team.sh +++ b/start-team.sh @@ -1,5 +1,12 @@ #!/bin/bash +# remove logs directory +rm -rf logs +# create logs directory +if [ ! -d "./logs" ]; then + mkdir -p "./logs" +fi + # Ensure the script exits if any command fails set -e # check scripts/proxy directory does not exist, raise error @@ -67,8 +74,12 @@ sleep 2 # Start start.sh script in the correct directory with arguments echo "Starting start.sh with team name: $team_name and ..." + +log_dir="logs/proxy.log" +abspath=$(realpath $log_dir) + cd scripts/proxy -bash start.sh -t "$team_name" --rpc-port $rpc_port & +bash start.sh -t "$team_name" --rpc-port $rpc_port --rpc-type grpc >> $abspath 2>&1 & start_pid=$! # Wait for both background processes to finish diff --git a/utils/logger_utils.py b/utils/logger_utils.py new file mode 100644 index 0000000..5f73f7d --- /dev/null +++ b/utils/logger_utils.py @@ -0,0 +1,50 @@ +import logging +import os + + +def setup_logger(name, log_file=None, console_level=logging.INFO, file_level=logging.DEBUG, console_format_str=None, file_format_str=None): + """ + Set up a logger that writes to both a file and the console, with different formats and levels. + + :param name: Name of the logger. + :param log_file: Path to the log file. + :param console_level: Logging level for the console output. + :param file_level: Logging level for the file output. + :return: Configured logger. + """ + have_console_handler = console_level is not None + have_file_handler = file_level is not None + if log_file is None: + log_file = os.path.join('logs', f'{name}.log') + # Directory + directory = os.path.dirname(log_file) + if directory and not os.path.exists(directory): + os.makedirs(directory) + + print(f"have_console_handler={have_console_handler}, have_file_handler={have_file_handler}", log_file, directory) + # Create a custom logger + logger = logging.getLogger(name) + + if not logger.hasHandlers(): + logger.setLevel(logging.DEBUG) # Set the overall logger level to the lowest level you want to capture + # Console handler + if have_console_handler: + console_handler = logging.StreamHandler() # For console output + console_handler.setLevel(console_level) + if not console_format_str: + console_format_str = '%(name)s - %(levelname)s - %(message)s' + console_format = logging.Formatter(console_format_str) + console_handler.setFormatter(console_format) + logger.addHandler(console_handler) + + # File handler + if have_file_handler: + file_handler = logging.FileHandler(log_file) # For file output + file_handler.setLevel(file_level) + if not file_format_str: + file_format_str = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' + file_format = logging.Formatter(file_format_str) + file_handler.setFormatter(file_format) + logger.addHandler(file_handler) + + return logger From 32d2deeb0e313efc25760a0d137b1f60a6bc7a27 Mon Sep 17 00:00:00 2001 From: naderzare Date: Mon, 30 Sep 2024 21:45:11 -0300 Subject: [PATCH 2/4] run proxy in debug mode --- start-team.py | 4 +++- start-team.sh | 11 +++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/start-team.py b/start-team.py index 1135c4b..8efbd4a 100644 --- a/start-team.py +++ b/start-team.py @@ -27,7 +27,7 @@ def run_server_script(args): def run_start_script(args): # Start the start.sh script in its own directory as a new process group process = subprocess.Popen( - ['bash', 'start.sh', '-t', args.team_name, '--rpc-port', args.rpc_port], + ['bash', 'start.sh' if not args.debug else 'start-debug.sh', '-t', args.team_name, '--rpc-port', args.rpc_port, '--rpc-type', 'grpc'], cwd='scripts/proxy', # Corrected directory to where start.sh is located preexec_fn=os.setsid, # Create a new session and set the process group ID stdout=subprocess.PIPE, @@ -60,6 +60,8 @@ def kill_process_group(process): parser = argparse.ArgumentParser(description='Run server and team scripts.') parser.add_argument('-t', '--team_name', required=False, help='The name of the team', default='CLS') parser.add_argument('--rpc-port', required=False, help='The port of the server', default='50051') + parser.add_argument('-d', '--debug', required=False, help='Enable debug mode', default=False, action='store_true') + args = parser.parse_args() try: diff --git a/start-team.sh b/start-team.sh index 5ae5d09..d60b35b 100755 --- a/start-team.sh +++ b/start-team.sh @@ -17,6 +17,7 @@ fi team_name="CLS" rpc_port=50051 +debug=false # help function usage() { @@ -38,6 +39,9 @@ do rpc_port=$2 shift ;; + -d|--debug) + debug=true + ;; *) echo 1>&2 echo "invalid option \"${1}\"." 1>&2 @@ -79,8 +83,11 @@ log_dir="logs/proxy.log" abspath=$(realpath $log_dir) cd scripts/proxy -bash start.sh -t "$team_name" --rpc-port $rpc_port --rpc-type grpc >> $abspath 2>&1 & -start_pid=$! +if [ "$debug" = true ]; then + bash start-debug.sh -t "$team_name" --rpc-port $rpc_port --rpc-type grpc >> $abspath 2>&1 & +else + bash start.sh -t "$team_name" --rpc-port $rpc_port --rpc-type grpc >> $abspath 2>&1 & +fistart_pid=$! # Wait for both background processes to finish wait $server_pid From b0846f237a3f37a6b19e751f25dff5ff45e21c2b Mon Sep 17 00:00:00 2001 From: naderzare Date: Mon, 30 Sep 2024 21:54:19 -0300 Subject: [PATCH 3/4] fix bugs --- server.py | 2 +- start-team.py | 2 +- start-team.sh | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server.py b/server.py index ab681f2..fa615f4 100644 --- a/server.py +++ b/server.py @@ -145,7 +145,7 @@ def Register(self, register_request: RegisterRequest): uniform_number = register_request.uniform_number agent_type = register_request.agent_type self.logger: logging.Logger = setup_logger(f"Agent{register_request.uniform_number}-{self.shared_number_of_connections.value}", - "logs/Agent{register_request.uniform_number}-{self.shared_number_of_connections.value}.log", + f"logs/Agent{register_request.uniform_number}-{self.shared_number_of_connections.value}.log", console_level=console_logging_level, file_level=file_logging_level) res = RegisterResponse(client_id=self.shared_number_of_connections.value, team_name=team_name, diff --git a/start-team.py b/start-team.py index 8efbd4a..e9ba3d0 100644 --- a/start-team.py +++ b/start-team.py @@ -27,7 +27,7 @@ def run_server_script(args): def run_start_script(args): # Start the start.sh script in its own directory as a new process group process = subprocess.Popen( - ['bash', 'start.sh' if not args.debug else 'start-debug.sh', '-t', args.team_name, '--rpc-port', args.rpc_port, '--rpc-type', 'grpc'], + ['bash', 'start.sh' if not args.debug else 'start-debug.sh', '-t', args.team_name, '--rpc-port', args.rpc_port, '--rpc-type', 'thrift'], cwd='scripts/proxy', # Corrected directory to where start.sh is located preexec_fn=os.setsid, # Create a new session and set the process group ID stdout=subprocess.PIPE, diff --git a/start-team.sh b/start-team.sh index d60b35b..0fa559d 100755 --- a/start-team.sh +++ b/start-team.sh @@ -84,9 +84,9 @@ abspath=$(realpath $log_dir) cd scripts/proxy if [ "$debug" = true ]; then - bash start-debug.sh -t "$team_name" --rpc-port $rpc_port --rpc-type grpc >> $abspath 2>&1 & + bash start-debug.sh -t "$team_name" --rpc-port $rpc_port --rpc-type thrift >> $abspath 2>&1 & else - bash start.sh -t "$team_name" --rpc-port $rpc_port --rpc-type grpc >> $abspath 2>&1 & + bash start.sh -t "$team_name" --rpc-port $rpc_port --rpc-type thrift >> $abspath 2>&1 & fistart_pid=$! # Wait for both background processes to finish From 91e2657f3d1a1c66492af5c9decf95eb8eb76cfb Mon Sep 17 00:00:00 2001 From: naderzare Date: Tue, 1 Oct 2024 21:18:56 -0300 Subject: [PATCH 4/4] improve logger --- server.py | 14 +++++++++++--- start-team.py | 15 +++++++-------- start-team.sh | 23 ++++++++++++----------- utils/logger_utils.py | 14 ++++++-------- 4 files changed, 36 insertions(+), 30 deletions(-) diff --git a/server.py b/server.py index fa615f4..815cc7e 100644 --- a/server.py +++ b/server.py @@ -16,12 +16,14 @@ from pyrusgeom.vector_2d import Vector2D import argparse from utils.logger_utils import setup_logger +import datetime console_logging_level = logging.INFO file_logging_level = logging.DEBUG -main_logger = setup_logger("pmservice", "logs/pmservice.log", console_level=console_logging_level, file_level=file_logging_level) +main_logger = None +log_dir = None class GameHandler: @@ -32,7 +34,7 @@ def __init__(self, shared_lock, shared_number_of_connections): self.debug_mode: bool = False self.shared_lock = shared_lock self.shared_number_of_connections = shared_number_of_connections - self.logger: logging.Logger = setup_logger("Agent", "logs/Agent.log", console_level=console_logging_level, file_level=file_logging_level) + self.logger: logging.Logger = setup_logger("Agent", log_dir, console_level=console_logging_level, file_level=file_logging_level) def GetPlayerActions(self, state: State): self.logger.debug(f"================================= cycle={state.world_model.cycle}.{state.world_model.stoped_cycle} =================================") @@ -145,7 +147,7 @@ def Register(self, register_request: RegisterRequest): uniform_number = register_request.uniform_number agent_type = register_request.agent_type self.logger: logging.Logger = setup_logger(f"Agent{register_request.uniform_number}-{self.shared_number_of_connections.value}", - f"logs/Agent{register_request.uniform_number}-{self.shared_number_of_connections.value}.log", + log_dir, console_level=console_logging_level, file_level=file_logging_level) res = RegisterResponse(client_id=self.shared_number_of_connections.value, team_name=team_name, @@ -187,12 +189,18 @@ def serve(port, shared_lock, shared_number_of_connections): def main(): + global main_logger, log_dir manager = Manager() shared_lock = Lock() # Create a Lock for synchronization shared_number_of_connections = manager.Value('i', 0) parser = argparse.ArgumentParser(description='Run play maker server') parser.add_argument('-p', '--rpc-port', required=False, help='The port of the server', default=50051) + parser.add_argument('-l', '--log-dir', required=False, help='The directory of the log file', + default=f'logs/{datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")}') args = parser.parse_args() + log_dir = args.log_dir + main_logger = setup_logger("pmservice", log_dir, console_level=console_logging_level, file_level=file_logging_level) + serve(args.rpc_port, shared_lock, shared_number_of_connections) diff --git a/start-team.py b/start-team.py index e9ba3d0..11e89e1 100644 --- a/start-team.py +++ b/start-team.py @@ -6,18 +6,17 @@ import argparse import check_requirements from utils.logger_utils import setup_logger - -# remove logs directory -os.system("rm -rf logs") +import datetime # Set up logging -start_team_logger = setup_logger('start-team', 'logs/start-team.log', console_level=logging.DEBUG, file_level=logging.DEBUG, console_format_str='%(message)s') +log_dir = os.path.join(os.getcwd(), 'logs', datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')) +start_team_logger = setup_logger('start-team', log_dir, console_level=logging.DEBUG, file_level=logging.DEBUG, console_format_str='%(message)s') def run_server_script(args): # Start the server.py script as a new process group process = subprocess.Popen( - ['python3', 'server.py', '--rpc-port', args.rpc_port], + ['python3', 'server.py', '--rpc-port', args.rpc_port, '--log-dir', log_dir], preexec_fn=os.setsid, # Create a new session and set the process group ID stdout=subprocess.PIPE, stderr=subprocess.STDOUT # Capture stderr and redirect it to stdout @@ -43,7 +42,7 @@ def stream_output_to_console(process, prefix): def stream_output_to_file(process, prefix): # Stream output from the process and log it with a prefix - logger = setup_logger(prefix, console_level=None, file_level=logging.DEBUG) + logger = setup_logger(prefix, log_dir, console_level=None, file_level=logging.DEBUG) for line in iter(process.stdout.readline, b''): logger.info(line.decode().strip()) pass @@ -78,8 +77,8 @@ def kill_process_group(process): start_team_logger.debug(f"Started start.sh process with PID: {start_process.pid} with team name {args=}") # Monitor both processes and log their outputs - server_thread = threading.Thread(target=stream_output_to_console, args=(server_process, 'server:')) - start_thread = threading.Thread(target=stream_output_to_file, args=(start_process, 'proxy:')) + server_thread = threading.Thread(target=stream_output_to_console, args=(server_process, 'server')) + start_thread = threading.Thread(target=stream_output_to_file, args=(start_process, 'proxy')) server_thread.start() start_thread.start() diff --git a/start-team.sh b/start-team.sh index 0fa559d..0f7a9b3 100755 --- a/start-team.sh +++ b/start-team.sh @@ -1,12 +1,13 @@ #!/bin/bash -# remove logs directory -rm -rf logs -# create logs directory -if [ ! -d "./logs" ]; then - mkdir -p "./logs" +# create a log directory with the current date and time +log_dir="logs/$(date +'%Y-%m-%d_%H-%M-%S')" +if [ ! -d $log_dir ]; then + mkdir -p $log_dir fi +abs_log_dir_path=$(realpath $log_dir) + # Ensure the script exits if any command fails set -e # check scripts/proxy directory does not exist, raise error @@ -60,7 +61,7 @@ python3 check_requirements.py # Start server.py in the background echo "Starting server.py..." -python3 server.py --rpc-port $rpc_port & +python3 server.py --rpc-port $rpc_port --log-dir $abs_log_dir_path & server_pid=$! # Function to kill server and team processes on exit @@ -79,16 +80,16 @@ sleep 2 # Start start.sh script in the correct directory with arguments echo "Starting start.sh with team name: $team_name and ..." -log_dir="logs/proxy.log" -abspath=$(realpath $log_dir) +start_log_path="$abs_log_dir_path/proxy.log" cd scripts/proxy if [ "$debug" = true ]; then - bash start-debug.sh -t "$team_name" --rpc-port $rpc_port --rpc-type thrift >> $abspath 2>&1 & + bash start-debug.sh -t "$team_name" --rpc-port $rpc_port --rpc-type thrift >> $start_log_path 2>&1 & else - bash start.sh -t "$team_name" --rpc-port $rpc_port --rpc-type thrift >> $abspath 2>&1 & + bash start.sh -t "$team_name" --rpc-port $rpc_port --rpc-type thrift >> $start_log_path 2>&1 & +fi fistart_pid=$! # Wait for both background processes to finish wait $server_pid -wait $start_pid +wait $start_pid \ No newline at end of file diff --git a/utils/logger_utils.py b/utils/logger_utils.py index 5f73f7d..58b8778 100644 --- a/utils/logger_utils.py +++ b/utils/logger_utils.py @@ -2,7 +2,7 @@ import os -def setup_logger(name, log_file=None, console_level=logging.INFO, file_level=logging.DEBUG, console_format_str=None, file_format_str=None): +def setup_logger(name, log_dir, console_level=logging.INFO, file_level=logging.DEBUG, console_format_str=None, file_format_str=None): """ Set up a logger that writes to both a file and the console, with different formats and levels. @@ -14,14 +14,12 @@ def setup_logger(name, log_file=None, console_level=logging.INFO, file_level=log """ have_console_handler = console_level is not None have_file_handler = file_level is not None - if log_file is None: - log_file = os.path.join('logs', f'{name}.log') - # Directory - directory = os.path.dirname(log_file) - if directory and not os.path.exists(directory): - os.makedirs(directory) + + if not os.path.exists(log_dir): + os.makedirs(log_dir) - print(f"have_console_handler={have_console_handler}, have_file_handler={have_file_handler}", log_file, directory) + log_file = os.path.join(log_dir, f'{name}.log') + # Create a custom logger logger = logging.getLogger(name)