Source code for autogen_agentchat.logging._file_log_handler

import json
import logging
from dataclasses import asdict, is_dataclass
from datetime import datetime
from typing import Any

from ..teams._events import (
    ContentPublishEvent,
    SelectSpeakerEvent,
    TerminationEvent,
    ToolCallEvent,
    ToolCallResultEvent,
)


[docs] class FileLogHandler(logging.Handler): def __init__(self, filename: str) -> None: super().__init__() self.filename = filename self.file_handler = logging.FileHandler(filename)
[docs] def emit(self, record: logging.LogRecord) -> None: ts = datetime.fromtimestamp(record.created).isoformat() if isinstance(record.msg, ContentPublishEvent | ToolCallEvent | ToolCallResultEvent | TerminationEvent): log_entry = json.dumps( { "timestamp": ts, "source": record.msg.source, "agent_message": record.msg.agent_message.model_dump(), "type": record.msg.__class__.__name__, }, default=self.json_serializer, ) elif isinstance(record.msg, SelectSpeakerEvent): log_entry = json.dumps( { "timestamp": ts, "source": record.msg.source, "selected_speaker": record.msg.selected_speaker, "type": "SelectSpeakerEvent", }, default=self.json_serializer, ) else: raise ValueError(f"Unexpected log record: {record.msg}") file_record = logging.LogRecord( name=record.name, level=record.levelno, pathname=record.pathname, lineno=record.lineno, msg=log_entry, args=(), exc_info=record.exc_info, ) self.file_handler.emit(file_record)
[docs] def close(self) -> None: self.file_handler.close() super().close()
[docs] @staticmethod def json_serializer(obj: Any) -> Any: if is_dataclass(obj) and not isinstance(obj, type): return asdict(obj) elif isinstance(obj, type): return str(obj) return str(obj)