import io import json import tempfile import unittest import uuid from contextlib import redirect_stdout from pathlib import Path from sglang.srt.utils.log_utils import create_log_targets, log_json from sglang.test.ci.ci_register import register_cpu_ci register_cpu_ci(est_time=1, suite="default") class TestLogUtils(unittest.TestCase): def test_stdout(self): for targets in [["stdout"], None]: with self.subTest(targets=targets): buf = io.StringIO() with redirect_stdout(buf): loggers = create_log_targets( targets=targets, name_prefix=f"test_stdout_{uuid.uuid4()}" ) self.assertEqual(len(loggers), 1) log_json(loggers[0], "test.event", {"key": "value"}) data = json.loads(buf.getvalue().strip()) self.assertIn("timestamp", data) self.assertEqual(data["event"], "test.event") self.assertEqual(data["key"], "value") def test_file(self): with tempfile.TemporaryDirectory() as temp_dir: loggers = create_log_targets( targets=[temp_dir], name_prefix=f"test_file_{uuid.uuid4()}" ) self.assertEqual(len(loggers), 1) log_json(loggers, "file.event", {"data": 123}) _flush_all(loggers) data = _read_log_file(temp_dir) self.assertIn("timestamp", data) self.assertEqual(data["event"], "file.event") self.assertEqual(data["data"], 123) def test_multiple_targets(self): with tempfile.TemporaryDirectory() as temp_dir: buf = io.StringIO() with redirect_stdout(buf): loggers = create_log_targets( targets=["stdout", temp_dir], name_prefix=f"test_multi_{uuid.uuid4()}", ) self.assertEqual(len(loggers), 2) log_json(loggers, "multi.event", {"x": 1}) _flush_all(loggers) stdout_data = json.loads(buf.getvalue().strip()) file_data = _read_log_file(temp_dir) self.assertEqual(stdout_data["event"], "multi.event") self.assertEqual(file_data["event"], "multi.event") self.assertEqual(stdout_data["x"], file_data["x"]) def _flush_all(loggers: list) -> None: for logger in loggers: for handler in logger.handlers: handler.flush() def _read_log_file(temp_dir: str) -> dict: log_files = list(Path(temp_dir).glob("*.log")) assert len(log_files) == 1 return json.loads(log_files[0].read_text().strip()) if __name__ == "__main__": unittest.main()