Prhub

#25340 fix: strip "[asctime]" prefix when parsing JSON log lines in nightly tests

原始 PR 作者 Kangyan-Zhou 合并时间 2026-05-15 11:17 文件变更 3 提交数 1 评论 1 代码增减 +21 / -10

执行摘要

修复因日志前缀变更导致的夜间测试失败

三个夜间单 GPU 测试因日志格式变更持续失败,表现为 request.received event not foundscheduler.status event not found。PR body 引用了具体失败 CI 运行 URL。PR #24521 在 python/sglang/srt/utils/log_utils.py:53 添加了时间戳前缀,但测试解析逻辑未同步更新。

值得合入以修复 CI 稳定性;可精读解析逻辑的健壮性改进,这种 find + try/except 模式适合作为测试中解析带前缀日志的标准模式。

讨论亮点

无 review 讨论(仅一个批准)。

实现拆解

  1. 修改 _find_log_events 函数test_scheduler_status_logger.py):用 line.find("{") 替换 line.startswith("{"),找到第一个 { 位置后从该处开始解析 JSON,并捕获 json.JSONDecodeError 跳过非 JSON 行。
  2. 修改 TestRequestLoggerJson_verify_logs_verify_openai_logstest_request_logger.py):两个方法中的 JSON 解析逻辑均改为 line.find("{") + json.loads(line[idx:]) + try/except,移除原有的 line.strip()startswith 检查。
  3. 修改 _verify_multi_turn_logs 方法test_bench_serving_functionality.py):类似地改为 line.find("{") + try/except,并移除直接 json.loads(line) 的调用。
  4. 所有变更均为纯测试文件修改,共计 +21/-10 行,风险极低。
文件 模块 状态 重要度
test/registered/utils/test_scheduler_status_logger.py 调度器日志 modified 5.13
test/registered/utils/test_request_logger.py 请求日志 modified 4.44
test/registered/bench_fn/test_bench_serving_functionality.py 基准测试 modified 4.37

关键符号

_find_log_events

关键源码片段

test/registered/utils/test_scheduler_status_logger.py test-coverage

修改了 `_find_log_events` 函数,这是调度器状态日志解析的核心逻辑。

# test/registered/utils/test_scheduler_status_logger.pydef _find_log_events(log_dir: str, event_name: str):
    for f in Path(log_dir).glob("*.log"):
        for line in f.read_text().splitlines():
            # 不再依赖行首为 '{',而是找到第一个 '{' 的位置
            idx = line.find("{")
            if idx == -1:
                continue # 没有 JSON 对象就跳过
            try:
                data = json.loads(line[idx:])
            except json.JSONDecodeError:
                # 即使找到 '{' 也可能解析失败,安全跳过
                continue
            if data.get("event") == event_name:
                yield data
test/registered/utils/test_request_logger.py test-coverage

修改了两个辅助方法 `_verify_logs` 和 `_verify_openai_logs` 中的 JSON 解析逻辑。

# test/registered/utils/test_request_logger.py
# 在 _verify_logs 和 _verify_openai_logs 中解析 JSON 行的模式变为:
for line in content.splitlines():
    idx = line.find("{")
    if idx == -1:
        continue
    try:
        data = json.loads(line[idx:])
    except json.JSONDecodeError:
        continue
    # 后续逻辑不变
test/registered/bench_fn/test_bench_serving_functionality.py test-coverage

修改了 `_verify_multi_turn_logs` 中的日志解析逻辑。

# test/registered/bench_fn/test_bench_serving_functionality.py
# 在 _verify_multi_turn_logs 中解析 JSON 行的模式变为:
for line in content.splitlines():
    idx = line.find("{")
    if idx == -1:
        continue
    try:
        obj = json.loads(line[idx:])
    except json.JSONDecodeError:
        continue
    # 后续逻辑不变

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

低风险:仅修改测试辅助函数中的日志解析逻辑,不涉及生产代码。所有修改均增加 try/except 保护,即使解析失败也不会影响整体测试流程。改动范围局限在三个测试文件内。

直接影响三个夜间测试的稳定性,使其在日志带时间戳前缀的新格式下仍能正确解析 JSON 事件。对其他测试和系统无影响。

测试兼容性修复

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论