The logger module provides structured JSON logging with automatic file rotation and session-based tracking. All logs are output in JSON format with consistent fields for easy parsing and analysis.File:common/logger.py
New logger instance for the same component with updated session ID
Use Case:
Agent receives session ID after check-in
Update logger to include session ID in all subsequent logs
Example:
from common.logger import get_logger, update_session# Initial logger without sessionlogger = get_logger('agent')logger.info('Checking in to server')# Update after receiving session IDsession_id = checkin_response['session_id']logger = update_session(logger, session_id)logger.info('Session established') # Now includes session_id
logs/├── agent.log # Current agent logs├── agent.log.1 # Previous rotation├── agent.log.2 # Older rotation├── server.log # Current server logs├── server.log.1└── transport.log # Current transport logs
from common.logger import get_loggerlogger = get_logger('server')logger.debug('Debug message')logger.info('Server started on port 8443')logger.warning('High memory usage detected')logger.error('Failed to connect to database')logger.critical('System shutdown imminent')
from common.logger import get_logger, update_session# Start without sessionlogger = get_logger('agent')logger.info('Agent starting')# Update after check-insession_id = perform_checkin()logger = update_session(logger, session_id)logger.info('Session established', session_id=session_id)# All subsequent logs include session_idlogger.info('Polling for tasks')
class _JsonFormatter(logging.Formatter): def format(self, record: logging.LogRecord) -> str: entry = { 'timestamp': datetime.now(_TZ_UTC7).isoformat(), 'level': record.levelname, 'component': self._component, 'session_id': self._session_id, 'message': record.getMessage(), } # Add extra fields for key, value in record.__dict__.items(): if key not in _RESERVED_KEYS: entry[key] = value # Add exception info if record.exc_info: entry['exception'] = self.formatException(record.exc_info) return json.dumps(entry)