Grux3 / src /utils /logging.py
BladeSzaSza's picture
feat: working local agent with test cases passing
d61265e
import logging
import sys
import time
from typing import Optional
from functools import wraps
def setup_logging(level: str = "INFO", log_file: Optional[str] = None):
"""Setup logging configuration for A2A agents."""
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# Console handler
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(formatter)
# Root logger
logger = logging.getLogger()
logger.setLevel(getattr(logging, level.upper()))
logger.addHandler(console_handler)
# File handler if specified
if log_file:
file_handler = logging.FileHandler(log_file)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
return logger
def log_performance(func):
"""Decorator to log function performance."""
@wraps(func)
async def wrapper(*args, **kwargs):
logger = logging.getLogger(func.__module__)
start_time = time.time()
logger.info(f"Starting {func.__name__}")
try:
result = await func(*args, **kwargs)
duration = time.time() - start_time
logger.info(f"Completed {func.__name__} in {duration:.2f}s")
return result
except Exception as e:
duration = time.time() - start_time
logger.error(f"Failed {func.__name__} after {duration:.2f}s: {e}")
raise
return wrapper