Unverified Commit 82f021e2 authored by Zilin Zhu's avatar Zilin Zhu Committed by GitHub
Browse files

[router] add --log-level to sgl-router (#6512)

parent 0626f678
...@@ -79,7 +79,7 @@ router = Router( ...@@ -79,7 +79,7 @@ router = Router(
) )
``` ```
Use the `--verbose` flag with the CLI for more detailed logs. Use the `--log-level` flag with the CLI to set [log level](https://docs.sglang.ai/backend/server_arguments.html#logging).
### Metrics ### Metrics
......
...@@ -48,8 +48,8 @@ class RouterArgs: ...@@ -48,8 +48,8 @@ class RouterArgs:
eviction_interval: int = 60 eviction_interval: int = 60
max_tree_size: int = 2**24 max_tree_size: int = 2**24
max_payload_size: int = 256 * 1024 * 1024 # 256MB default for large batches max_payload_size: int = 256 * 1024 * 1024 # 256MB default for large batches
verbose: bool = False
log_dir: Optional[str] = None log_dir: Optional[str] = None
log_level: Optional[str] = None
# Service discovery configuration # Service discovery configuration
service_discovery: bool = False service_discovery: bool = False
selector: Dict[str, str] = dataclasses.field(default_factory=dict) selector: Dict[str, str] = dataclasses.field(default_factory=dict)
...@@ -178,17 +178,19 @@ class RouterArgs: ...@@ -178,17 +178,19 @@ class RouterArgs:
default=RouterArgs.max_payload_size, default=RouterArgs.max_payload_size,
help="Maximum payload size in bytes", help="Maximum payload size in bytes",
) )
parser.add_argument(
f"--{prefix}verbose",
action="store_true",
help="Enable verbose logging",
)
parser.add_argument( parser.add_argument(
f"--{prefix}log-dir", f"--{prefix}log-dir",
type=str, type=str,
default=None, default=None,
help="Directory to store log files. If not specified, logs are only output to console.", help="Directory to store log files. If not specified, logs are only output to console.",
) )
parser.add_argument(
f"--{prefix}log-level",
type=str,
default="info",
choices=["debug", "info", "warning", "error", "critical"],
help="Set the logging level. If not specified, defaults to INFO.",
)
parser.add_argument( parser.add_argument(
f"--{prefix}service-discovery", f"--{prefix}service-discovery",
action="store_true", action="store_true",
...@@ -275,8 +277,8 @@ class RouterArgs: ...@@ -275,8 +277,8 @@ class RouterArgs:
eviction_interval=getattr(args, f"{prefix}eviction_interval"), eviction_interval=getattr(args, f"{prefix}eviction_interval"),
max_tree_size=getattr(args, f"{prefix}max_tree_size"), max_tree_size=getattr(args, f"{prefix}max_tree_size"),
max_payload_size=getattr(args, f"{prefix}max_payload_size"), max_payload_size=getattr(args, f"{prefix}max_payload_size"),
verbose=getattr(args, f"{prefix}verbose", False),
log_dir=getattr(args, f"{prefix}log_dir", None), log_dir=getattr(args, f"{prefix}log_dir", None),
log_level=getattr(args, f"{prefix}log_level", None),
service_discovery=getattr(args, f"{prefix}service_discovery", False), service_discovery=getattr(args, f"{prefix}service_discovery", False),
selector=cls._parse_selector(getattr(args, f"{prefix}selector", None)), selector=cls._parse_selector(getattr(args, f"{prefix}selector", None)),
service_discovery_port=getattr(args, f"{prefix}service_discovery_port"), service_discovery_port=getattr(args, f"{prefix}service_discovery_port"),
...@@ -404,8 +406,8 @@ def launch_router(args: argparse.Namespace) -> Optional[Router]: ...@@ -404,8 +406,8 @@ def launch_router(args: argparse.Namespace) -> Optional[Router]:
eviction_interval_secs=router_args.eviction_interval, eviction_interval_secs=router_args.eviction_interval,
max_tree_size=router_args.max_tree_size, max_tree_size=router_args.max_tree_size,
max_payload_size=router_args.max_payload_size, max_payload_size=router_args.max_payload_size,
verbose=router_args.verbose,
log_dir=router_args.log_dir, log_dir=router_args.log_dir,
log_level=router_args.log_level,
service_discovery=router_args.service_discovery, service_discovery=router_args.service_discovery,
selector=router_args.selector, selector=router_args.selector,
service_discovery_port=router_args.service_discovery_port, service_discovery_port=router_args.service_discovery_port,
......
...@@ -31,8 +31,8 @@ class Router: ...@@ -31,8 +31,8 @@ class Router:
routing. Default: 60 routing. Default: 60
max_payload_size: Maximum payload size in bytes. Default: 256MB max_payload_size: Maximum payload size in bytes. Default: 256MB
max_tree_size: Maximum size of the approximation tree for cache-aware routing. Default: 2^24 max_tree_size: Maximum size of the approximation tree for cache-aware routing. Default: 2^24
verbose: Enable verbose logging. Default: False
log_dir: Directory to store log files. If None, logs are only output to console. Default: None log_dir: Directory to store log files. If None, logs are only output to console. Default: None
log_level: Logging level. Options: 'debug', 'info', 'warning', 'error', 'critical'.
service_discovery: Enable Kubernetes service discovery. When enabled, the router will service_discovery: Enable Kubernetes service discovery. When enabled, the router will
automatically discover worker pods based on the selector. Default: False automatically discover worker pods based on the selector. Default: False
selector: Dictionary mapping of label keys to values for Kubernetes pod selection. selector: Dictionary mapping of label keys to values for Kubernetes pod selection.
...@@ -66,8 +66,8 @@ class Router: ...@@ -66,8 +66,8 @@ class Router:
eviction_interval_secs: int = 60, eviction_interval_secs: int = 60,
max_tree_size: int = 2**24, max_tree_size: int = 2**24,
max_payload_size: int = 256 * 1024 * 1024, # 256MB max_payload_size: int = 256 * 1024 * 1024, # 256MB
verbose: bool = False,
log_dir: Optional[str] = None, log_dir: Optional[str] = None,
log_level: Optional[str] = None,
service_discovery: bool = False, service_discovery: bool = False,
selector: Dict[str, str] = None, selector: Dict[str, str] = None,
service_discovery_port: int = 80, service_discovery_port: int = 80,
...@@ -100,8 +100,8 @@ class Router: ...@@ -100,8 +100,8 @@ class Router:
eviction_interval_secs=eviction_interval_secs, eviction_interval_secs=eviction_interval_secs,
max_tree_size=max_tree_size, max_tree_size=max_tree_size,
max_payload_size=max_payload_size, max_payload_size=max_payload_size,
verbose=verbose,
log_dir=log_dir, log_dir=log_dir,
log_level=log_level,
service_discovery=service_discovery, service_discovery=service_discovery,
selector=selector, selector=selector,
service_discovery_port=service_discovery_port, service_discovery_port=service_discovery_port,
......
...@@ -38,6 +38,7 @@ class TestLaunchRouter(unittest.TestCase): ...@@ -38,6 +38,7 @@ class TestLaunchRouter(unittest.TestCase):
max_payload_size=256 * 1024 * 1024, # 256MB max_payload_size=256 * 1024 * 1024, # 256MB
verbose=False, verbose=False,
log_dir=None, log_dir=None,
log_level=None,
service_discovery=False, service_discovery=False,
selector=None, selector=None,
service_discovery_port=80, service_discovery_port=80,
......
...@@ -27,8 +27,8 @@ pub struct RouterConfig { ...@@ -27,8 +27,8 @@ pub struct RouterConfig {
pub metrics: Option<MetricsConfig>, pub metrics: Option<MetricsConfig>,
/// Log directory (None = stdout only) /// Log directory (None = stdout only)
pub log_dir: Option<String>, pub log_dir: Option<String>,
/// Verbose logging /// Log level (None = info)
pub verbose: bool, pub log_level: Option<String>,
} }
/// Routing mode configuration /// Routing mode configuration
...@@ -177,7 +177,7 @@ impl Default for RouterConfig { ...@@ -177,7 +177,7 @@ impl Default for RouterConfig {
discovery: None, discovery: None,
metrics: None, metrics: None,
log_dir: None, log_dir: None,
verbose: false, log_level: None,
} }
} }
} }
......
...@@ -37,8 +37,8 @@ struct Router { ...@@ -37,8 +37,8 @@ struct Router {
eviction_interval_secs: u64, eviction_interval_secs: u64,
max_tree_size: usize, max_tree_size: usize,
max_payload_size: usize, max_payload_size: usize,
verbose: bool,
log_dir: Option<String>, log_dir: Option<String>,
log_level: Option<String>,
service_discovery: bool, service_discovery: bool,
selector: HashMap<String, String>, selector: HashMap<String, String>,
service_discovery_port: u16, service_discovery_port: u16,
...@@ -129,7 +129,7 @@ impl Router { ...@@ -129,7 +129,7 @@ impl Router {
discovery, discovery,
metrics, metrics,
log_dir: self.log_dir.clone(), log_dir: self.log_dir.clone(),
verbose: self.verbose, log_level: self.log_level.clone(),
}) })
} }
} }
...@@ -150,8 +150,8 @@ impl Router { ...@@ -150,8 +150,8 @@ impl Router {
eviction_interval_secs = 60, eviction_interval_secs = 60,
max_tree_size = 2usize.pow(24), max_tree_size = 2usize.pow(24),
max_payload_size = 256 * 1024 * 1024, // 256MB default for large batches max_payload_size = 256 * 1024 * 1024, // 256MB default for large batches
verbose = false,
log_dir = None, log_dir = None,
log_level = None,
service_discovery = false, service_discovery = false,
selector = HashMap::new(), selector = HashMap::new(),
service_discovery_port = 80, service_discovery_port = 80,
...@@ -179,8 +179,8 @@ impl Router { ...@@ -179,8 +179,8 @@ impl Router {
eviction_interval_secs: u64, eviction_interval_secs: u64,
max_tree_size: usize, max_tree_size: usize,
max_payload_size: usize, max_payload_size: usize,
verbose: bool,
log_dir: Option<String>, log_dir: Option<String>,
log_level: Option<String>,
service_discovery: bool, service_discovery: bool,
selector: HashMap<String, String>, selector: HashMap<String, String>,
service_discovery_port: u16, service_discovery_port: u16,
...@@ -208,8 +208,8 @@ impl Router { ...@@ -208,8 +208,8 @@ impl Router {
eviction_interval_secs, eviction_interval_secs,
max_tree_size, max_tree_size,
max_payload_size, max_payload_size,
verbose,
log_dir, log_dir,
log_level,
service_discovery, service_discovery,
selector, selector,
service_discovery_port, service_discovery_port,
...@@ -283,9 +283,9 @@ impl Router { ...@@ -283,9 +283,9 @@ impl Router {
port: self.port, port: self.port,
worker_urls: self.worker_urls.clone(), worker_urls: self.worker_urls.clone(),
policy_config, policy_config,
verbose: self.verbose,
max_payload_size: self.max_payload_size, max_payload_size: self.max_payload_size,
log_dir: self.log_dir.clone(), log_dir: self.log_dir.clone(),
log_level: self.log_level.clone(),
service_discovery_config, service_discovery_config,
prometheus_config, prometheus_config,
request_timeout_secs: self.request_timeout_secs, request_timeout_secs: self.request_timeout_secs,
......
...@@ -278,9 +278,9 @@ pub struct ServerConfig { ...@@ -278,9 +278,9 @@ pub struct ServerConfig {
pub port: u16, pub port: u16,
pub worker_urls: Vec<String>, pub worker_urls: Vec<String>,
pub policy_config: PolicyConfig, pub policy_config: PolicyConfig,
pub verbose: bool,
pub max_payload_size: usize, pub max_payload_size: usize,
pub log_dir: Option<String>, pub log_dir: Option<String>,
pub log_level: Option<String>,
pub service_discovery_config: Option<ServiceDiscoveryConfig>, pub service_discovery_config: Option<ServiceDiscoveryConfig>,
pub prometheus_config: Option<PrometheusConfig>, pub prometheus_config: Option<PrometheusConfig>,
pub request_timeout_secs: u64, pub request_timeout_secs: u64,
...@@ -292,11 +292,17 @@ pub async fn startup(config: ServerConfig) -> std::io::Result<()> { ...@@ -292,11 +292,17 @@ pub async fn startup(config: ServerConfig) -> std::io::Result<()> {
let _log_guard = if !LOGGING_INITIALIZED.swap(true, Ordering::SeqCst) { let _log_guard = if !LOGGING_INITIALIZED.swap(true, Ordering::SeqCst) {
Some(logging::init_logging(LoggingConfig { Some(logging::init_logging(LoggingConfig {
level: if config.verbose { level: config
Level::DEBUG .log_level
} else { .as_deref()
Level::INFO .and_then(|s| match s.to_uppercase().parse::<Level>() {
}, Ok(l) => Some(l),
Err(_) => {
warn!("Invalid log level string: '{}'. Defaulting to INFO.", s);
None
}
})
.unwrap_or(Level::INFO),
json_format: false, json_format: false,
log_dir: config.log_dir.clone(), log_dir: config.log_dir.clone(),
colorize: true, colorize: true,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment