每个进程/meeting 单独写: - events.jsonl:收到的每条服务端消息(在线/离线/2pass) - meta.json:本次运行参数(方便复现)
| 76 | |
| 77 | |
| 78 | class MeetingWriter: |
| 79 | """ |
| 80 | 每个进程/meeting 单独写: |
| 81 | - events.jsonl:收到的每条服务端消息(在线/离线/2pass) |
| 82 | - meta.json:本次运行参数(方便复现) |
| 83 | """ |
| 84 | def __init__(self, log_dir: str, meeting_id: str, flush_every: int = 1): |
| 85 | self.meeting_id = str(meeting_id) |
| 86 | self.base = os.path.join(log_dir, f"meeting_{self.meeting_id}") |
| 87 | os.makedirs(self.base, exist_ok=True) |
| 88 | |
| 89 | self.fp_events = open(os.path.join(self.base, "events.jsonl"), "a", encoding="utf-8") |
| 90 | self.flush_every = max(1, int(flush_every)) |
| 91 | self._cnt = 0 |
| 92 | |
| 93 | meta_path = os.path.join(self.base, "meta.json") |
| 94 | if not os.path.exists(meta_path): |
| 95 | with open(meta_path, "w", encoding="utf-8") as f: |
| 96 | meta = { |
| 97 | "created_at": _iso(time.time()), |
| 98 | "meeting_id": self.meeting_id, |
| 99 | "args": vars(args), |
| 100 | } |
| 101 | f.write(json.dumps(meta, ensure_ascii=False, indent=2)) |
| 102 | |
| 103 | def write_event(self, obj: dict): |
| 104 | self.fp_events.write(json.dumps(obj, ensure_ascii=False) + "\n") |
| 105 | self._cnt += 1 |
| 106 | if self._cnt % self.flush_every == 0: |
| 107 | self.fp_events.flush() |
| 108 | |
| 109 | def close(self): |
| 110 | try: |
| 111 | self.fp_events.flush() |
| 112 | self.fp_events.close() |
| 113 | except Exception: |
| 114 | pass |
| 115 | |
| 116 | |
| 117 | if args.output_dir is not None: |
no outgoing calls
no test coverage detected
searching dependent graphs…