@@ -42,7 +42,10 @@ async def create_replay_session(self, config: ReplayConfig) -> str:
4242 state = ReplaySessionState (session_id = str (uuid4 ()), config = config )
4343 self ._sessions [state .session_id ] = state
4444
45- self .logger .info (f"Created replay session { state .session_id } type={ config .replay_type } target={ config .target } " )
45+ self .logger .info (
46+ "Created replay session" ,
47+ extra = {"session_id" : state .session_id , "type" : config .replay_type , "target" : config .target },
48+ )
4649
4750 return state .session_id
4851
@@ -61,7 +64,7 @@ async def start_replay(self, session_id: str) -> None:
6164 session .started_at = datetime .now (timezone .utc )
6265
6366 self ._metrics .increment_active_replays ()
64- self .logger .info (f "Started replay session { session_id } " )
67+ self .logger .info ("Started replay session" , extra = { " session_id" : session_id } )
6568
6669 async def _run_replay (self , session : ReplaySessionState ) -> None :
6770 start_time = asyncio .get_event_loop ().time ()
@@ -97,7 +100,10 @@ async def _prepare_session(self, session: ReplaySessionState) -> None:
97100 total_count = await self ._repository .count_events (session .config .filter )
98101 session .total_events = min (total_count , session .config .max_events or total_count )
99102
100- self .logger .info (f"Replay session { session .session_id } will process { session .total_events } events" )
103+ self .logger .info (
104+ "Replay session will process events" ,
105+ extra = {"session_id" : session .session_id , "total_events" : session .total_events },
106+ )
101107
102108 async def _handle_progress_callback (self , session : ReplaySessionState ) -> None :
103109 cb = session .config .get_progress_callback ()
@@ -119,15 +125,22 @@ async def _complete_session(self, session: ReplaySessionState, start_time: float
119125 await self ._update_session_in_db (session )
120126
121127 self .logger .info (
122- f"Replay session { session .session_id } completed. "
123- f"Replayed: { session .replayed_events } , "
124- f"Failed: { session .failed_events } , "
125- f"Skipped: { session .skipped_events } , "
126- f"Duration: { duration :.2f} s"
128+ "Replay session completed" ,
129+ extra = {
130+ "session_id" : session .session_id ,
131+ "replayed_events" : session .replayed_events ,
132+ "failed_events" : session .failed_events ,
133+ "skipped_events" : session .skipped_events ,
134+ "duration_seconds" : round (duration , 2 ),
135+ },
127136 )
128137
129138 async def _handle_session_error (self , session : ReplaySessionState , error : Exception ) -> None :
130- self .logger .error (f"Replay session { session .session_id } failed: { error } " , exc_info = True )
139+ self .logger .error (
140+ "Replay session failed" ,
141+ extra = {"session_id" : session .session_id , "error" : str (error )},
142+ exc_info = True ,
143+ )
131144 session .status = ReplayStatus .FAILED
132145 session .completed_at = datetime .now (timezone .utc )
133146 session .errors .append (
@@ -154,7 +167,7 @@ def _update_replay_metrics(self, session: ReplaySessionState, event: BaseEvent,
154167 self ._metrics .record_event_replayed (session .config .replay_type , event .event_type , status )
155168
156169 async def _handle_replay_error (self , session : ReplaySessionState , event : BaseEvent , error : Exception ) -> None :
157- self .logger .error (f "Failed to replay event { event .event_id } : { error } " )
170+ self .logger .error ("Failed to replay event" , extra = { "event_id" : event .event_id , "error" : str ( error )} )
158171 session .failed_events += 1
159172 session .errors .append (
160173 {"timestamp" : datetime .now (timezone .utc ).isoformat (), "event_id" : str (event .event_id ), "error" : str (error )}
@@ -184,7 +197,7 @@ async def _replay_to_file(self, event: BaseEvent, file_path: str | None) -> bool
184197 return True
185198
186199 async def _fetch_event_batches (self , session : ReplaySessionState ) -> AsyncIterator [List [BaseEvent ]]:
187- self .logger .info (f "Fetching events for session { session .session_id } " )
200+ self .logger .info ("Fetching events for session" , extra = { "session_id" : session .session_id })
188201 events_processed = 0
189202 max_events = session .config .max_events
190203
@@ -250,10 +263,13 @@ async def _replay_event(self, session: ReplaySessionState, event: BaseEvent) ->
250263 elif config .target == ReplayTarget .TEST :
251264 return True
252265 else :
253- self .logger .error (f "Unknown replay target: { config .target } " )
266+ self .logger .error ("Unknown replay target" , extra = { "target" : config .target })
254267 return False
255268 except Exception as e :
256- self .logger .error (f"Failed to replay event (attempt { attempt + 1 } /{ attempts } ): { e } " )
269+ self .logger .error (
270+ "Failed to replay event" ,
271+ extra = {"attempt" : attempt + 1 , "max_attempts" : attempts , "error" : str (e )},
272+ )
257273 if attempt < attempts - 1 :
258274 await asyncio .sleep (min (2 ** attempt , 10 ))
259275 continue
@@ -279,7 +295,7 @@ async def pause_replay(self, session_id: str) -> None:
279295
280296 if session .status == ReplayStatus .RUNNING :
281297 session .status = ReplayStatus .PAUSED
282- self .logger .info (f "Paused replay session { session_id } " )
298+ self .logger .info ("Paused replay session" , extra = { " session_id" : session_id } )
283299
284300 async def resume_replay (self , session_id : str ) -> None :
285301 session = self ._sessions .get (session_id )
@@ -288,7 +304,7 @@ async def resume_replay(self, session_id: str) -> None:
288304
289305 if session .status == ReplayStatus .PAUSED :
290306 session .status = ReplayStatus .RUNNING
291- self .logger .info (f "Resumed replay session { session_id } " )
307+ self .logger .info ("Resumed replay session" , extra = { " session_id" : session_id } )
292308
293309 async def cancel_replay (self , session_id : str ) -> None :
294310 session = self ._sessions .get (session_id )
@@ -301,7 +317,7 @@ async def cancel_replay(self, session_id: str) -> None:
301317 if task and not task .done ():
302318 task .cancel ()
303319
304- self .logger .info (f "Cancelled replay session { session_id } " )
320+ self .logger .info ("Cancelled replay session" , extra = { " session_id" : session_id } )
305321
306322 def get_session (self , session_id : str ) -> ReplaySessionState | None :
307323 return self ._sessions .get (session_id )
@@ -330,7 +346,7 @@ async def cleanup_old_sessions(self, older_than_hours: int = 24) -> int:
330346 del self ._sessions [session_id ]
331347 removed += 1
332348
333- self .logger .info (f "Cleaned up { removed } old replay sessions" )
349+ self .logger .info ("Cleaned up old replay sessions" , extra = { "removed_count" : removed } )
334350 return removed
335351
336352 async def _update_session_in_db (self , session : ReplaySessionState ) -> None :
0 commit comments