1
1
import json
2
2
import logging
3
- from dataclasses import asdict , is_dataclass
4
3
from datetime import datetime
5
- from typing import Any
6
4
7
- from ..agents ._assistant_agent import ToolCallEvent , ToolCallResultEvent
8
- from ..teams ._events import (
9
- GroupChatPublishEvent ,
10
- GroupChatSelectSpeakerEvent ,
11
- TerminationEvent ,
12
- )
5
+ from pydantic import BaseModel
13
6
14
7
15
8
class FileLogHandler (logging .Handler ):
@@ -20,65 +13,12 @@ def __init__(self, filename: str) -> None:
20
13
21
14
def emit (self , record : logging .LogRecord ) -> None :
22
15
ts = datetime .fromtimestamp (record .created ).isoformat ()
23
- if isinstance (record .msg , GroupChatPublishEvent | TerminationEvent ):
24
- log_entry = json .dumps (
16
+ if isinstance (record .msg , BaseModel ):
17
+ record . msg = json .dumps (
25
18
{
26
19
"timestamp" : ts ,
27
- "source" : record .msg .source ,
28
- "agent_message" : record .msg .agent_message .model_dump (),
20
+ "message" : record .msg .model_dump (),
29
21
"type" : record .msg .__class__ .__name__ ,
30
22
},
31
- default = self .json_serializer ,
32
23
)
33
- elif isinstance (record .msg , GroupChatSelectSpeakerEvent ):
34
- log_entry = json .dumps (
35
- {
36
- "timestamp" : ts ,
37
- "source" : record .msg .source ,
38
- "selected_speaker" : record .msg .selected_speaker ,
39
- "type" : "SelectSpeakerEvent" ,
40
- },
41
- default = self .json_serializer ,
42
- )
43
- elif isinstance (record .msg , ToolCallEvent ):
44
- log_entry = json .dumps (
45
- {
46
- "timestamp" : ts ,
47
- "tool_calls" : record .msg .model_dump (),
48
- "type" : "ToolCallEvent" ,
49
- },
50
- default = self .json_serializer ,
51
- )
52
- elif isinstance (record .msg , ToolCallResultEvent ):
53
- log_entry = json .dumps (
54
- {
55
- "timestamp" : ts ,
56
- "tool_call_results" : record .msg .model_dump (),
57
- "type" : "ToolCallResultEvent" ,
58
- },
59
- default = self .json_serializer ,
60
- )
61
- else :
62
- raise ValueError (f"Unexpected log record: { record .msg } " )
63
- file_record = logging .LogRecord (
64
- name = record .name ,
65
- level = record .levelno ,
66
- pathname = record .pathname ,
67
- lineno = record .lineno ,
68
- msg = log_entry ,
69
- args = (),
70
- exc_info = record .exc_info ,
71
- )
72
- self .file_handler .emit (file_record )
73
-
74
- def close (self ) -> None :
75
- self .file_handler .close ()
76
- super ().close ()
77
-
78
- @staticmethod
79
- def json_serializer (obj : Any ) -> Any :
80
- if is_dataclass (obj ) and not isinstance (obj , type ):
81
- return asdict (obj )
82
- elif isinstance (obj , type ):
83
- return str (obj )
84
- return str (obj )
24
+ self .file_handler .emit (record )
0 commit comments