1313from codeclash .constants import DIR_LOGS , DIR_WORK , GH_ORG
1414from codeclash .games .utils import copy_between_containers , copy_file_from_container
1515from codeclash .utils .environment import assert_zero_exit_code
16+ from codeclash .utils .log import get_logger
1617
1718
1819class CodeGame (ABC ):
@@ -27,6 +28,9 @@ def __init__(self, config: dict):
2728 self .round : int = 0
2829 self .game_id : str = f"{ self .name } { uuid4 ().hex [:6 ]} "
2930 self .log_path : Path = (DIR_WORK / DIR_LOGS / self .game_id ).resolve ()
31+ self .logger = get_logger (
32+ self .name , log_path = DIR_LOGS / self .game_id / "game.log" , emoji = "🏓"
33+ )
3034 self .environment : DockerEnvironment = self .get_environment ()
3135 assert len (config ["players" ]) >= 2 , "At least two players are required"
3236
@@ -57,18 +61,20 @@ def build_image(self):
5761 text = True ,
5862 )
5963 if result .returncode == 0 :
60- print (f"✅ Built Docker image { self .image_name } " )
64+ self . logger . info (f"✅ Built Docker image { self .image_name } " )
6165 else :
62- print (f"❌ Failed to build Docker image: { result .stderr } " )
66+ self .logger .error (
67+ f"❌ Failed to build Docker image: { result .stderr } \n { result .stdout } { result .stderr } "
68+ )
6369 raise
6470
6571 def end (self , cleanup : bool = False ):
66- print (Counter ([x [1 ] for x in self .scoreboard ]))
72+ self . logger . info (Counter ([x [1 ] for x in self .scoreboard ]))
6773 if cleanup :
6874 for artifact in self .artifacts :
6975 if artifact .exists ():
7076 subprocess .run (f"rm -rf { artifact } " , shell = True )
71- print (f"🧼 Cleaned up { self .name } game" )
77+ self . logger . info (f"🧼 Cleaned up { self .name } game" )
7278
7379 def get_environment (self , branch_name : str | None = None ) -> DockerEnvironment :
7480 """Get docker container ID with the game code installed."""
@@ -87,7 +93,7 @@ def get_environment(self, branch_name: str | None = None) -> DockerEnvironment:
8793 'git config --global user.name "Player"' ,
8894 "git config --global commit.gpgsign false" ,
8995 ]:
90- assert_zero_exit_code (environment .execute (cmd ))
96+ assert_zero_exit_code (environment .execute (cmd ), logger = self . logger )
9197 return environment
9298
9399 def _pre_round_setup (self , agents : list [Player ]):
@@ -97,10 +103,11 @@ def _pre_round_setup(self, agents: list[Player]):
97103 for agent in agents :
98104 if hasattr (agent , "on_round_update" ):
99105 agent .on_round_update (self .round )
100- print (f"▶️ Running { self .name } round { self .round } ..." )
106+ self . logger . info (f"▶️ Running { self .name } round { self .round } ..." )
101107
102108 # Copy agent codebases into game's container
103109 for agent in agents :
110+ self .logger .debug (f"Copying { agent .name } 's codebase" )
104111 copy_between_containers (
105112 src_container = agent .environment ,
106113 dest_container = self .environment ,
@@ -109,8 +116,12 @@ def _pre_round_setup(self, agents: list[Player]):
109116 )
110117
111118 # Ensure the log path + file exists
112- assert_zero_exit_code (self .environment .execute (f"mkdir -p { self .log_path } " ))
113- assert_zero_exit_code (self .environment .execute (f"touch { self .round_log_path } " ))
119+ assert_zero_exit_code (
120+ self .environment .execute (f"mkdir -p { self .log_path } " ), logger = self .logger
121+ )
122+ assert_zero_exit_code (
123+ self .environment .execute (f"touch { self .round_log_path } " ), logger = self .logger
124+ )
114125
115126 @abstractmethod
116127 def determine_winner (self , agents : list [Player ]) -> Any :
@@ -132,11 +143,11 @@ def _post_round_setup(self, agents: list[Player]):
132143 f"{ agent .environment .config .cwd } /logs/round_{ self .round } .log" ,
133144 )
134145 except Exception :
135- print (
146+ self . logger . error (
136147 f"Error copying round log to { agent .name } 's container: { traceback .format_exc ()} "
137148 )
138149 else :
139- print (f"Copied round log to { agent .name } 's container." )
150+ self . logger . info (f"Copied round log to { agent .name } 's container." )
140151
141152 try :
142153 copy_file_from_container (
@@ -145,14 +156,14 @@ def _post_round_setup(self, agents: list[Player]):
145156 DIR_LOGS / f"{ self .game_id } /round_{ self .round } .log" ,
146157 )
147158 except Exception :
148- print (
159+ self . logger . error (
149160 f"Error copying round log to { agent .name } 's container: { traceback .format_exc ()} "
150161 )
151162 else :
152- print (
163+ self . logger . info (
153164 f"Copied round log from { agent .name } 's container to local log dir."
154165 )
155- print (f"Round { self .round } completed." )
166+ self . logger . info (f"Round { self .round } completed." )
156167
157168 def run_round (self , agents : list [Player ]):
158169 """
@@ -164,7 +175,7 @@ def run_round(self, agents: list[Player]):
164175 self .execute_round (agents )
165176 self .determine_winner (agents )
166177 last_winner = self .scoreboard [- 1 ][1 ]
167- print (f"Round { self .round } winner: { last_winner } " )
178+ self . logger . info (f"Round { self .round } winner: { last_winner } " )
168179 self ._post_round_setup (agents )
169180
170181 @property
0 commit comments