Phase 1: add libs/observability crate (build_logger, instance_id); remove duplicate logger init from 4 crates Phase 2: Actix-web RequestLogger with trace_id; MetricsMiddleware + HttpMetrics Phase 3: Git SSH handle.rs slog struct; HTTP handler Logger kv Phase 4: AI client eprintln -> slog warn; billing ai_usage_recorded log Phase 5: SessionManager slog; workspace alert slog 2.x syntax
46 lines
1.3 KiB
Rust
46 lines
1.3 KiB
Rust
use clap::Parser;
|
|
use config::AppConfig;
|
|
use observability::build_logger;
|
|
|
|
#[derive(Parser, Debug)]
|
|
#[command(name = "gitserver")]
|
|
#[command(version)]
|
|
struct Args {
|
|
#[arg(long, default_value = "info")]
|
|
log_level: String,
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() -> anyhow::Result<()> {
|
|
let args = Args::parse();
|
|
let cfg = AppConfig::load();
|
|
let log = build_logger(&args.log_level);
|
|
|
|
let http_handle = tokio::spawn(git::http::run_http(cfg.clone(), log.clone()));
|
|
let ssh_handle = tokio::spawn(git::ssh::run_ssh(cfg, log.clone()));
|
|
|
|
tokio::select! {
|
|
result = http_handle => {
|
|
match result {
|
|
Ok(Ok(())) => slog::info!(log, "HTTP server stopped"),
|
|
Ok(Err(e)) => slog::error!(log, "HTTP server error: {}", e),
|
|
Err(e) => slog::error!(log, "HTTP server task panicked: {}", e),
|
|
}
|
|
}
|
|
result = ssh_handle => {
|
|
match result {
|
|
Ok(Ok(())) => slog::info!(log, "SSH server stopped"),
|
|
Ok(Err(e)) => slog::error!(log, "SSH server error: {}", e),
|
|
Err(e) => slog::error!(log, "SSH server task panicked: {}", e),
|
|
}
|
|
}
|
|
_ = tokio::signal::ctrl_c() => {
|
|
slog::info!(log, "received shutdown signal");
|
|
}
|
|
}
|
|
|
|
slog::info!(log, "shutting down");
|
|
Ok(())
|
|
}
|
|
|