@@ -106,14 +106,70 @@ def log_step_completion(self, step_name: str, step_number: int, total_steps: int
106106 self .info (f"Completed { step_name } ({ step_number } /{ total_steps } - { progress :.1f} %)" )
107107
108108
109- def step_printer (steps : List [Any ], logger : Optional [ChefAnalysisLogger ] = None ):
109+ class CorrelationLogger :
110+ """Generic logger for any agent type with correlation ID tracking."""
111+
112+ def __init__ (self , agent_name : str , correlation_id : str ):
113+ self .agent_name = agent_name
114+ self .correlation_id = correlation_id
115+ self .logger = logging .getLogger (f"{ agent_name } _{ correlation_id } " )
116+ self .logger .setLevel (logging .INFO )
117+
118+ # Create console handler if not already exists
119+ if not self .logger .handlers :
120+ console_handler = logging .StreamHandler (sys .stdout )
121+ console_handler .setLevel (logging .INFO )
122+
123+ # Create formatter
124+ formatter = logging .Formatter (
125+ '%(asctime)s - %(name)s - %(levelname)s - [%(correlation_id)s] %(message)s'
126+ )
127+ console_handler .setFormatter (formatter )
128+ self .logger .addHandler (console_handler )
129+
130+ # Add correlation ID to log records
131+ for handler in self .logger .handlers :
132+ handler .setFormatter (logging .Formatter (
133+ '%(asctime)s - %(name)s - %(levelname)s - [%(correlation_id)s] %(message)s'
134+ ))
135+
136+ def _log_with_correlation (self , level : str , message : str ):
137+ """Log message with correlation ID."""
138+ extra = {'correlation_id' : self .correlation_id }
139+ if level == 'info' :
140+ self .logger .info (message , extra = extra )
141+ elif level == 'warning' :
142+ self .logger .warning (message , extra = extra )
143+ elif level == 'error' :
144+ self .logger .error (message , extra = extra )
145+ elif level == 'debug' :
146+ self .logger .debug (message , extra = extra )
147+
148+ def info (self , message : str ):
149+ """Log info message."""
150+ self ._log_with_correlation ('info' , message )
151+
152+ def warning (self , message : str ):
153+ """Log warning message."""
154+ self ._log_with_correlation ('warning' , message )
155+
156+ def error (self , message : str ):
157+ """Log error message."""
158+ self ._log_with_correlation ('error' , message )
159+
160+ def debug (self , message : str ):
161+ """Log debug message."""
162+ self ._log_with_correlation ('debug' , message )
163+
164+
165+ def step_printer (steps : List [Any ], logger : Optional [Any ] = None ):
110166 """
111167 Print the steps of an agent's response in a formatted way.
112168 Enhanced version with Chef Analysis specific logging.
113169
114170 Args:
115171 steps: List of steps from an agent's response
116- logger: Optional ChefAnalysisLogger instance
172+ logger: Optional logger instance (ChefAnalysisLogger or CorrelationLogger)
117173 """
118174 if not steps :
119175 if logger :
@@ -188,6 +244,11 @@ def create_chef_logger(correlation_id: str) -> ChefAnalysisLogger:
188244 return ChefAnalysisLogger (correlation_id )
189245
190246
247+ def create_correlation_logger (agent_name : str , correlation_id : str ) -> CorrelationLogger :
248+ """Create a generic correlation logger for any agent type."""
249+ return CorrelationLogger (agent_name , correlation_id )
250+
251+
191252def setup_logging (level : str = "INFO" ) -> None :
192253 """Setup basic logging configuration."""
193254 logging .basicConfig (
0 commit comments