Prhub

#22506 [gateway] Support SGLANG_LOG_MS for millisecond precision in router logs

sgl-project/sglang · 作者 ZhaiFeiyue · 合并时间 2026-04-14 08:28

分析状态 已生成
文件变更 1提交数 2 · 评论 3
代码增减 +12 / -2
observability run-ci model-gateway

执行摘要

为 Rust 网关添加毫秒级日志时间戳支持,与 Python SRT 行为对齐。

根据PR body的描述,主要动机是"matching the existing Python SRT behavior (PR #14183)",即让Rust网关的日志时间戳精度与Python SRT保持一致。当SGLANG_LOG_MS=true(或1)时,日志时间戳从"2026-04-10 06:35:37"变为"2026-04-10 06:35:37.313",提供更精细的时间信息。

该PR变更简单直接,适合快速了解环境变量控制日志格式的模式。值得关注的是review中提到的环境变量解析健壮性问题,虽然当前实现已满足基本需求,但在生产环境中可能需要更严格的错误处理。

讨论亮点

review中只有gemini-code-assist[bot]提出了一个改进建议:当前环境变量检查对大小写敏感且只接受"true"或"1"的精确匹配,建议增强健壮性,处理大小写不敏感和去除空白字符。该建议提供了具体的代码实现方案,但PR作者未在提交中采纳此建议。HaiShaw仅进行了批准操作并请求另一位reviewer查看。

实现拆解

实现集中在单个文件sgl-model-gateway/src/observability/logging.rs中:1. 新增常量TIME_FORMAT_MS定义毫秒级时间格式"%Y-%m-%d %H:%M:%S%.3f";2. 新增get_time_format()函数,通过检查SGLANG_LOG_MS环境变量值(支持"true"或"1")动态选择时间格式;3. 修改init_logging函数,将原先硬编码的TIME_FORMAT替换为通过get_time_format()获取的动态格式,同时应用到stdout_layer和file_layer两个日志层。

文件 模块 状态 重要度
sgl-model-gateway/src/observability/logging.rs gateway/observability modified 8.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

get_time_format() init_logging

评论区精华

环境变量解析的健壮性 正确性

gemini-code-assist[bot] 指出当前环境变量检查对大小写敏感且只接受精确匹配,建议增强为大小写不敏感并去除空白字符。

结论:建议未被采纳,PR 保持原有实现。 · 已解决

风险与影响

风险较低:1. 核心变更仅涉及日志格式,不影响业务逻辑;2. 环境变量检查逻辑相对简单,但如review建议所指出的,当前实现对大小写敏感,可能导致某些环境配置下功能不生效(如用户设置"TRUE"或"True");3. 新增函数get_time_format()在每次日志初始化时调用一次,性能开销可忽略;4. 无测试覆盖变更,但日志格式变更通常不需要复杂测试。

影响范围有限:1. 对用户:提供了更精细的日志时间戳选项,便于调试和监控,但需要显式设置环境变量才能生效;2. 对系统:仅改变日志输出格式,不影响网关的核心路由、推理等业务功能;3. 对团队:统一了Rust网关和Python SRT的日志行为,减少了跨组件调试时的认知负担。

环境变量解析限制

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

该PR为Rust网关(sgl-model-gateway)的日志系统添加了对SGLANG_LOG_MS环境变量的支持,允许用户启用毫秒级时间戳精度,从而与Python SRT的现有行为对齐。变更仅涉及单个文件的日志格式配置,风险低,影响范围有限,属于常规的功能增强。

功能与动机

主要动机是统一Rust网关和Python SRT的日志行为,如PR body所述:"matching the existing Python SRT behavior (PR #14183)"。当用户设置SGLANG_LOG_MS=true(或1)时,日志时间戳将从"2026-04-10 06:35:37"变为"2026-04-10 06:35:37.313",提供更精细的时间信息,便于调试和性能分析。

实现拆解

所有变更集中在sgl-model-gateway/src/observability/logging.rs文件中:

  1. 新增时间格式常量
    rust const TIME_FORMAT_MS: &str = "%Y-%m-%d %H:%M:%S%.3f";

  2. 新增格式选择函数
    rust fn get_time_format() -> &'static str { match std::env::var("SGLANG_LOG_MS") { Ok(v) if matches!(v.trim().to_lowercase().as_str(), "true" | "1") => TIME_FORMAT_MS, _ => TIME_FORMAT, } }

  3. 修改日志初始化:在init_logging函数中,将原先硬编码的TIME_FORMAT替换为get_time_format()的返回值,并同时应用到stdout_layerfile_layer

评论区精华

review中仅有一次实质性讨论:

gemini-code-assist[bot] 指出:"The environment variable check is currently case-sensitive and only accepts exact matches for 'true' or '1'. For better usability and robustness, it's recommended to handle case-insensitivity (e.g., 'TRUE', 'True') and potentially trim whitespace."

该建议提供了具体的代码改进方案,但PR作者在最终提交中未采纳,保持了原有的简单实现。

风险与影响

风险分析

  • 环境变量解析逻辑相对简单,对大小写敏感,可能导致某些配置下功能不生效(如用户设置"TRUE")。
  • 变更仅影响日志格式,不涉及核心业务逻辑,回归风险极低。
  • 无新增测试覆盖,但日志格式变更通常不需要复杂测试。

影响评估

  • 对用户:提供了可选的毫秒级时间戳,增强调试能力,但需显式设置环境变量。
  • 对系统:仅改变日志输出格式,不影响网关的路由、推理等核心功能。
  • 对团队:统一了Rust网关和Python SRT的日志行为,减少了跨组件调试时的差异。

关联脉络

根据PR body提及,该PR是为了与PR #14183(Python SRT的日志行为)保持一致,体现了项目在跨组件(Rust网关 vs Python SRT)可观测性行为统一上的持续努力。从近期历史PR看,项目在observability领域有多项改进(如PR 22331、22730),该PR是这一趋势的延续。

参与讨论