refactor: add shared logging crate
This commit is contained in:
9
server-rs/Cargo.lock
generated
9
server-rs/Cargo.lock
generated
@@ -25,12 +25,12 @@ dependencies = [
|
||||
"http-body-util",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"shared-logging",
|
||||
"time",
|
||||
"tokio",
|
||||
"tower",
|
||||
"tower-http",
|
||||
"tracing",
|
||||
"tracing-subscriber",
|
||||
"uuid",
|
||||
]
|
||||
|
||||
@@ -572,6 +572,13 @@ dependencies = [
|
||||
"lazy_static",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "shared-logging"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"tracing-subscriber",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "slab"
|
||||
version = "0.4.12"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
resolver = "2"
|
||||
members = [
|
||||
"crates/api-server",
|
||||
"crates/shared-logging",
|
||||
]
|
||||
|
||||
[workspace.package]
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
## 2. 当前阶段说明
|
||||
|
||||
当前目录已经完成以下三十四项初始化:
|
||||
当前目录已经完成以下三十五项初始化:
|
||||
|
||||
1. 为新后端预留正式目录并把路径固定到仓库结构中。
|
||||
2. 创建虚拟 workspace `Cargo.toml`,后续 crate 会逐项挂入。
|
||||
@@ -35,21 +35,22 @@
|
||||
17. 创建 `crates/module-ai/` 目录占位,固定 AI 编排模块 crate 落位。
|
||||
18. 创建 `crates/shared-contracts/` 目录占位,固定前后端兼容 contract 共享 crate 落位。
|
||||
19. 创建 `crates/shared-kernel/` 目录占位,固定跨模块共享领域内核 crate 落位。
|
||||
20. 创建 `crates/platform-auth/` 目录占位,固定鉴权平台适配 crate 落位。
|
||||
21. 创建 `crates/platform-oss/` 目录占位,固定 OSS 平台适配 crate 落位。
|
||||
22. 创建 `crates/platform-llm/` 目录占位,固定大模型平台适配 crate 落位。
|
||||
23. 创建 `crates/spacetime-client/` 目录占位,固定 SpacetimeDB 客户端适配 crate 落位。
|
||||
24. 创建 `crates/tests-support/` 目录占位,固定测试支撑共享 crate 落位。
|
||||
25. 创建 `scripts/dev.ps1`,固定 Windows 本地开发入口。
|
||||
26. 创建 `scripts/dev.sh`,固定 Unix-like 本地开发入口。
|
||||
27. 创建 `scripts/test.ps1`,固定 Windows 本地测试入口。
|
||||
28. 创建 `scripts/test.sh`,固定 Unix-like 本地测试入口。
|
||||
29. 创建 `scripts/check.ps1`,固定 Windows 本地统一检查入口。
|
||||
30. 创建 `scripts/check.sh`,固定 Unix-like 本地统一检查入口。
|
||||
31. 创建 `scripts/smoke.ps1`,固定 Windows 本地冒烟验证入口。
|
||||
32. 创建 `scripts/smoke.sh`,固定 Unix-like 本地冒烟验证入口。
|
||||
33. 创建 `scripts/spacetime-dev.ps1`,固定 Windows 本地 SpacetimeDB 启动入口。
|
||||
34. 创建 `scripts/spacetime-dev.sh`,固定 Unix-like 本地 SpacetimeDB 启动入口。
|
||||
20. 创建 `crates/shared-logging/` 目录占位,固定工作区统一日志 crate 落位。
|
||||
21. 创建 `crates/platform-auth/` 目录占位,固定鉴权平台适配 crate 落位。
|
||||
22. 创建 `crates/platform-oss/` 目录占位,固定 OSS 平台适配 crate 落位。
|
||||
23. 创建 `crates/platform-llm/` 目录占位,固定大模型平台适配 crate 落位。
|
||||
24. 创建 `crates/spacetime-client/` 目录占位,固定 SpacetimeDB 客户端适配 crate 落位。
|
||||
25. 创建 `crates/tests-support/` 目录占位,固定测试支撑共享 crate 落位。
|
||||
26. 创建 `scripts/dev.ps1`,固定 Windows 本地开发入口。
|
||||
27. 创建 `scripts/dev.sh`,固定 Unix-like 本地开发入口。
|
||||
28. 创建 `scripts/test.ps1`,固定 Windows 本地测试入口。
|
||||
29. 创建 `scripts/test.sh`,固定 Unix-like 本地测试入口。
|
||||
30. 创建 `scripts/check.ps1`,固定 Windows 本地统一检查入口。
|
||||
31. 创建 `scripts/check.sh`,固定 Unix-like 本地统一检查入口。
|
||||
32. 创建 `scripts/smoke.ps1`,固定 Windows 本地冒烟验证入口。
|
||||
33. 创建 `scripts/smoke.sh`,固定 Unix-like 本地冒烟验证入口。
|
||||
34. 创建 `scripts/spacetime-dev.ps1`,固定 Windows 本地 SpacetimeDB 启动入口。
|
||||
35. 创建 `scripts/spacetime-dev.sh`,固定 Unix-like 本地 SpacetimeDB 启动入口。
|
||||
|
||||
后续任务会继续在本目录内按顺序补齐:
|
||||
|
||||
|
||||
@@ -8,11 +8,11 @@ license.workspace = true
|
||||
axum = "0.8"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
shared-logging = { path = "../shared-logging" }
|
||||
tokio = { version = "1", features = ["macros", "rt-multi-thread", "net"] }
|
||||
time = { version = "0.3", features = ["formatting"] }
|
||||
tower-http = { version = "0.6", features = ["trace"] }
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] }
|
||||
uuid = { version = "1", features = ["v4"] }
|
||||
|
||||
[dev-dependencies]
|
||||
|
||||
@@ -26,8 +26,8 @@
|
||||
4. `src/app.rs`
|
||||
5. `src/state.rs`
|
||||
6. `src/config.rs`
|
||||
7. `src/logging.rs`
|
||||
8. 基础 `TraceLayer` 挂载与 `tracing subscriber` 初始化
|
||||
7. 基础 `TraceLayer` 挂载
|
||||
8. 接入 `shared-logging` 完成 `tracing subscriber` 初始化
|
||||
|
||||
后续与本 crate 直接相关的任务包括:
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
当前 tracing 约定:
|
||||
|
||||
1. 进程启动时统一初始化 `tracing subscriber`。
|
||||
1. 进程启动时通过 `shared-logging` 统一初始化 `tracing subscriber`。
|
||||
2. 默认日志过滤器来自 `GENARRATIVE_API_LOG`,未提供时回落到 `info,tower_http=info`。
|
||||
3. HTTP 访问日志统一通过 Axum 路由层的 `TraceLayer` 输出,后续 `request_id`、响应头与错误中间件继续在同一层扩展。
|
||||
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
use std::io;
|
||||
|
||||
use tracing_subscriber::{fmt, EnvFilter};
|
||||
|
||||
use crate::config::AppConfig;
|
||||
|
||||
// 统一在独立模块初始化 tracing,避免入口层和后续测试入口重复散落 subscriber 配置。
|
||||
pub fn init_tracing(config: &AppConfig) -> Result<(), io::Error> {
|
||||
let env_filter = EnvFilter::try_from_default_env()
|
||||
.or_else(|_| EnvFilter::try_new(config.log_filter.as_str()))
|
||||
.unwrap_or_else(|_| EnvFilter::new("info"));
|
||||
|
||||
fmt()
|
||||
.with_env_filter(env_filter)
|
||||
.with_target(true)
|
||||
.compact()
|
||||
.try_init()
|
||||
.map_err(|error| io::Error::other(format!("初始化 tracing subscriber 失败:{error}")))
|
||||
}
|
||||
@@ -4,21 +4,21 @@ mod config;
|
||||
mod error_middleware;
|
||||
mod health;
|
||||
mod http_error;
|
||||
mod logging;
|
||||
mod request_context;
|
||||
mod response_headers;
|
||||
mod state;
|
||||
|
||||
use shared_logging::init_tracing;
|
||||
use tokio::net::TcpListener;
|
||||
use tracing::info;
|
||||
|
||||
use crate::{app::build_router, config::AppConfig, logging::init_tracing, state::AppState};
|
||||
use crate::{app::build_router, config::AppConfig, state::AppState};
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), std::io::Error> {
|
||||
// 统一先从配置对象读取监听地址,避免后续把环境变量读取散落到入口和路由层。
|
||||
let config = AppConfig::from_env();
|
||||
init_tracing(&config)?;
|
||||
init_tracing(&config.log_filter)?;
|
||||
|
||||
let bind_address = config.bind_socket_addr();
|
||||
let listener = TcpListener::bind(bind_address).await?;
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
# platform-auth 平台适配 package 占位说明
|
||||
# platform-auth 平台适配 crate 占位说明
|
||||
|
||||
日期:`2026-04-20`
|
||||
|
||||
## 1. package 职责
|
||||
## 1. crate 职责
|
||||
|
||||
`platform-auth` 是鉴权平台适配 package,后续负责:
|
||||
`platform-auth` 是鉴权平台适配 crate,后续负责:
|
||||
|
||||
1. JWT 签发与校验适配
|
||||
2. refresh cookie 读写与轮换适配
|
||||
3. 手机验证码发送与校验适配
|
||||
4. 微信 OAuth 相关平台适配
|
||||
5. 供 `module-auth` 与 `apps/api-server` 复用的鉴权基础设施能力
|
||||
5. 供 `module-auth` 与 `crates/api-server` 复用的鉴权基础设施能力
|
||||
|
||||
## 2. 当前阶段说明
|
||||
|
||||
当前提交仅完成目录占位,不提前进入 JWT、Cookie、短信与微信平台实现。
|
||||
|
||||
后续与本 package 直接相关的任务包括:
|
||||
后续与本 crate 直接相关的任务包括:
|
||||
|
||||
1. 落地 JWT claims、签发与校验适配
|
||||
2. 落地 refresh cookie 读取、写入与轮换适配
|
||||
@@ -26,5 +26,5 @@
|
||||
## 3. 边界约束
|
||||
|
||||
1. `platform-auth` 只承接平台适配,不承接 `module-auth` 的业务规则和状态真相。
|
||||
2. 鉴权状态最终由 `module-auth` 与 `apps/spacetime-module` 管理,前端接口由 `apps/api-server` 暴露。
|
||||
2. 鉴权状态最终由 `module-auth` 与 `crates/spacetime-module` 管理,前端接口由 `crates/api-server` 暴露。
|
||||
3. 不允许把短信、微信、Cookie、JWT 等外部细节重新散落到多个业务模块中各自实现。
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# shared-contracts 共享 package 占位说明
|
||||
# shared-contracts 共享 crate 占位说明
|
||||
|
||||
日期:`2026-04-20`
|
||||
|
||||
## 1. package 职责
|
||||
## 1. crate 职责
|
||||
|
||||
`shared-contracts` 是前后端兼容 contract 共享 package,后续负责:
|
||||
`shared-contracts` 是前后端兼容 contract 共享 crate,后续负责:
|
||||
|
||||
1. HTTP 请求与响应 DTO
|
||||
2. SSE 事件结构与事件名约定
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
当前提交仅完成目录占位,不提前进入 DTO、事件与兼容结构实现。
|
||||
|
||||
后续与本 package 直接相关的任务包括:
|
||||
后续与本 crate 直接相关的任务包括:
|
||||
|
||||
1. 对齐现有前端直接依赖的响应头与 envelope
|
||||
2. 对齐 story、custom world、chat 等 SSE 事件结构
|
||||
@@ -25,5 +25,5 @@
|
||||
## 3. 边界约束
|
||||
|
||||
1. `shared-contracts` 只放协议类型与兼容结构,不承接业务规则、供应商适配或状态写入逻辑。
|
||||
2. 各模块 package 对外暴露的协议优先复用这里的共享定义,避免重复散落。
|
||||
3. 前端兼容契约一旦进入本 package,就必须与任务清单和基线文档同步维护。
|
||||
2. 各模块 crate 对外暴露的协议优先复用这里的共享定义,避免重复散落。
|
||||
3. 前端兼容契约一旦进入本 crate,就必须与任务清单和基线文档同步维护。
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# shared-kernel 共享 package 占位说明
|
||||
# shared-kernel 共享 crate 占位说明
|
||||
|
||||
日期:`2026-04-20`
|
||||
|
||||
## 1. package 职责
|
||||
## 1. crate 职责
|
||||
|
||||
`shared-kernel` 是跨模块共享领域内核 package,后续负责:
|
||||
`shared-kernel` 是跨模块共享领域内核 crate,后续负责:
|
||||
|
||||
1. 共享 ID、值对象、枚举与基础领域类型
|
||||
2. 共享时间、状态、版本、通用校验等基础规则
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
当前提交仅完成目录占位,不提前进入具体共享类型与基础规则实现。
|
||||
|
||||
后续与本 package 直接相关的任务包括:
|
||||
后续与本 crate 直接相关的任务包括:
|
||||
|
||||
1. 统一用户、会话、世界、角色、资产等核心 ID 类型
|
||||
2. 统一时间戳、版本号、状态枚举等共享结构
|
||||
@@ -24,5 +24,5 @@
|
||||
## 3. 边界约束
|
||||
|
||||
1. `shared-kernel` 只放跨模块最小共享内核,不承接具体业务模块的私有规则。
|
||||
2. 任何进入本 package 的类型都必须证明至少被多个模块稳定复用。
|
||||
2. 任何进入本 crate 的类型都必须证明至少被多个模块稳定复用。
|
||||
3. 不能把主模块实现重新堆进共享内核,避免形成新的“大公共垃圾桶”。
|
||||
|
||||
8
server-rs/crates/shared-logging/Cargo.toml
Normal file
8
server-rs/crates/shared-logging/Cargo.toml
Normal file
@@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "shared-logging"
|
||||
edition.workspace = true
|
||||
version.workspace = true
|
||||
license.workspace = true
|
||||
|
||||
[dependencies]
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] }
|
||||
32
server-rs/crates/shared-logging/README.md
Normal file
32
server-rs/crates/shared-logging/README.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# shared-logging 共享日志 crate 占位说明
|
||||
|
||||
日期:`2026-04-21`
|
||||
|
||||
## 1. crate 职责
|
||||
|
||||
`shared-logging` 是 Rust 工作区统一日志基础设施 crate,后续负责:
|
||||
|
||||
1. 统一 `tracing subscriber` 初始化入口
|
||||
2. 统一日志过滤器解析逻辑
|
||||
3. 统一当前阶段日志输出风格
|
||||
4. 为 `api-server`、后续 `spacetime-module`、测试支撑与独立入口提供可复用日志初始化能力
|
||||
|
||||
## 2. 当前阶段说明
|
||||
|
||||
当前阶段已完成最小落地:
|
||||
|
||||
1. 提供 `resolve_env_filter(...)`
|
||||
2. 提供 `init_tracing(...)`
|
||||
3. 把 `api-server` 的日志初始化逻辑迁出为共享 crate
|
||||
|
||||
后续与本 crate 直接相关的任务包括:
|
||||
|
||||
1. 根据环境扩展日志输出格式
|
||||
2. 补充测试入口、worker 入口与其它主工程 crate 的统一接入
|
||||
3. 视需要补充 JSON 输出、链路追踪或远端采集适配
|
||||
|
||||
## 3. 边界约束
|
||||
|
||||
1. `shared-logging` 只承接日志初始化与基础设施,不承接 HTTP 业务语义。
|
||||
2. `TraceLayer`、request id、响应头、错误 envelope 等 HTTP 逻辑继续留在 `api-server`。
|
||||
3. 不允许把业务埋点、审计事件或供应商日志适配塞进本 crate。
|
||||
22
server-rs/crates/shared-logging/src/lib.rs
Normal file
22
server-rs/crates/shared-logging/src/lib.rs
Normal file
@@ -0,0 +1,22 @@
|
||||
use std::io;
|
||||
|
||||
use tracing_subscriber::{fmt, EnvFilter};
|
||||
|
||||
// 统一解析工作区日志过滤器,优先环境变量,其次回落到调用方传入的默认值。
|
||||
pub fn resolve_env_filter(default_filter: &str) -> EnvFilter {
|
||||
EnvFilter::try_from_default_env()
|
||||
.or_else(|_| EnvFilter::try_new(default_filter))
|
||||
.unwrap_or_else(|_| EnvFilter::new("info"))
|
||||
}
|
||||
|
||||
// 统一初始化 tracing subscriber,避免各入口重复散落相同配置。
|
||||
pub fn init_tracing(default_filter: &str) -> Result<(), io::Error> {
|
||||
let env_filter = resolve_env_filter(default_filter);
|
||||
|
||||
fmt()
|
||||
.with_env_filter(env_filter)
|
||||
.with_target(true)
|
||||
.compact()
|
||||
.try_init()
|
||||
.map_err(|error| io::Error::other(format!("初始化 tracing subscriber 失败:{error}")))
|
||||
}
|
||||
@@ -1,20 +1,20 @@
|
||||
# tests-support 共享 package 占位说明
|
||||
# tests-support 共享 crate 占位说明
|
||||
|
||||
日期:`2026-04-20`
|
||||
|
||||
## 1. package 职责
|
||||
## 1. crate 职责
|
||||
|
||||
`tests-support` 是测试支撑共享 package,后续负责:
|
||||
`tests-support` 是测试支撑共享 crate,后续负责:
|
||||
|
||||
1. contract、integration、smoke 测试的共享夹具与辅助工具
|
||||
2. 测试环境配置、测试数据装配与断言工具
|
||||
3. 供 `apps/api-server`、`apps/spacetime-module` 与各模块 package 复用的测试基础设施能力
|
||||
3. 供 `crates/api-server`、`crates/spacetime-module` 与各模块 crate 复用的测试基础设施能力
|
||||
|
||||
## 2. 当前阶段说明
|
||||
|
||||
当前提交仅完成目录占位,不提前进入测试夹具、断言工具与 smoke 支撑实现。
|
||||
|
||||
后续与本 package 直接相关的任务包括:
|
||||
后续与本 crate 直接相关的任务包括:
|
||||
|
||||
1. 设计接口测试与 contract 回归共享夹具
|
||||
2. 设计 reducer / view / projection 测试辅助
|
||||
@@ -25,4 +25,4 @@
|
||||
|
||||
1. `tests-support` 只承接测试支撑能力,不承接业务规则实现。
|
||||
2. 测试夹具要尽量贴近真实 contract 与真实模块边界,避免重新引入脱离现网的伪环境。
|
||||
3. 不允许把测试辅助逻辑散落到各模块 package 中重复实现。
|
||||
3. 不允许把测试辅助逻辑散落到各模块 crate 中重复实现。
|
||||
|
||||
Reference in New Issue
Block a user