refactor(setting): 优化配置启动日志与错误提示
1. 移除main.go中重复的TTS配置错误警告 2. 统一日志中文全角逗号格式 3. 新增TTS配置项脱敏掩码函数 4. 完善启动日志的必填项检查和状态展示 5. 调整TTS配置错误的提示文案,明确500路由情况
This commit is contained in:
@@ -23,17 +23,15 @@ func main() {
|
|||||||
// 所有环境变量读取在 setting 包内集中完成,业务模块只读全局 Config。
|
// 所有环境变量读取在 setting 包内集中完成,业务模块只读全局 Config。
|
||||||
setting.InitAllConfigs()
|
setting.InitAllConfigs()
|
||||||
|
|
||||||
// 兼容旧调用顺序:rate limiter / 静态文件 / stats / controller 的初始化保持独立。
|
// 兼容旧调用顺序:rate limiter / 静态文件 / stats / controller 的初始化保持独立。
|
||||||
middleware.InitRateLimiter()
|
middleware.InitRateLimiter()
|
||||||
setting.CheckStaticFiles()
|
setting.CheckStaticFiles()
|
||||||
service.InitStats()
|
service.InitStats()
|
||||||
controller.InitController()
|
controller.InitController()
|
||||||
|
|
||||||
// 启动期一次性打印所有 Config 状态,便于运维核对。
|
// 启动期一次性打印所有 Config 状态,便于运维核对。
|
||||||
|
// (必填项缺失的明确警告由 LogStartupSummary 自身负责,避免重复打印。)
|
||||||
setting.LogStartupSummary()
|
setting.LogStartupSummary()
|
||||||
if setting.TTSConfigErr != nil {
|
|
||||||
log.Printf("警告: 服务将继续运行,但 TTS 功能不可用,请检查环境变量配置")
|
|
||||||
}
|
|
||||||
|
|
||||||
controller.SetStartTime(time.Now())
|
controller.SetStartTime(time.Now())
|
||||||
|
|
||||||
|
|||||||
+51
-8
@@ -140,7 +140,7 @@ func InitTTSConfig() error {
|
|||||||
if parsedTimeout, err := time.ParseDuration(timeoutStr); err == nil {
|
if parsedTimeout, err := time.ParseDuration(timeoutStr); err == nil {
|
||||||
timeout = parsedTimeout
|
timeout = parsedTimeout
|
||||||
} else {
|
} else {
|
||||||
log.Printf("无效的超时设置 '%s',使用默认值: %v", timeoutStr, timeout)
|
log.Printf("无效的超时设置 '%s',使用默认值: %v", timeoutStr, timeout)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,12 +154,12 @@ func InitTTSConfig() error {
|
|||||||
sampleRate := 24000
|
sampleRate := 24000
|
||||||
if srStr := os.Getenv("BYTEDANCE_TTS_SAMPLE_RATE"); srStr != "" {
|
if srStr := os.Getenv("BYTEDANCE_TTS_SAMPLE_RATE"); srStr != "" {
|
||||||
if sr, err := fmt.Sscanf(srStr, "%d", &sampleRate); err != nil || sr != 1 {
|
if sr, err := fmt.Sscanf(srStr, "%d", &sampleRate); err != nil || sr != 1 {
|
||||||
log.Printf("无效的采样率设置 '%s',使用默认值: 24000", srStr)
|
log.Printf("无效的采样率设置 '%s',使用默认值: 24000", srStr)
|
||||||
sampleRate = 24000
|
sampleRate = 24000
|
||||||
}
|
}
|
||||||
validRates := map[int]bool{8000: true, 16000: true, 22050: true, 24000: true, 32000: true, 44100: true, 48000: true}
|
validRates := map[int]bool{8000: true, 16000: true, 22050: true, 24000: true, 32000: true, 44100: true, 48000: true}
|
||||||
if !validRates[sampleRate] {
|
if !validRates[sampleRate] {
|
||||||
log.Printf("不支持的采样率 %d,使用默认值: 24000", sampleRate)
|
log.Printf("不支持的采样率 %d,使用默认值: 24000", sampleRate)
|
||||||
sampleRate = 24000
|
sampleRate = 24000
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -179,14 +179,17 @@ func InitTTSConfig() error {
|
|||||||
|
|
||||||
// LogStartupSummary 在启动期打印所有 Config 的最终状态。
|
// LogStartupSummary 在启动期打印所有 Config 的最终状态。
|
||||||
// 调用时机:InitAllConfigs 之后,ListenAndServe 之前。
|
// 调用时机:InitAllConfigs 之后,ListenAndServe 之前。
|
||||||
|
// 必填项逐项输出,失败分支明确告知"v1/audio/speech 路由将 500"。
|
||||||
func LogStartupSummary() {
|
func LogStartupSummary() {
|
||||||
log.Printf("=== 环境配置汇总 ===")
|
log.Printf("=== 环境配置汇总 ===")
|
||||||
log.Printf("服务端口: %s", Server.Port)
|
log.Printf("服务端口: %s", Server.Port)
|
||||||
|
|
||||||
if len(Auth.APIKeys) == 0 {
|
if len(Auth.APIKeys) == 0 {
|
||||||
log.Printf("OPENAI_TTS_API_KEY: 未设置(所有请求无需鉴权)")
|
log.Printf("OPENAI_TTS_API_KEY: 未设置(所有请求无需鉴权)")
|
||||||
} else {
|
} else {
|
||||||
log.Printf("OPENAI_TTS_API_KEY: 已设置 %d 个有效密钥", len(Auth.APIKeys))
|
log.Printf("OPENAI_TTS_API_KEY: 已设置 %d 个有效密钥", len(Auth.APIKeys))
|
||||||
}
|
}
|
||||||
|
|
||||||
if CORS.AllowAll {
|
if CORS.AllowAll {
|
||||||
log.Printf("ALLOWED_ORIGINS: *(允许所有跨域,不可与凭据共用)")
|
log.Printf("ALLOWED_ORIGINS: *(允许所有跨域,不可与凭据共用)")
|
||||||
} else if len(CORS.Origins) == 0 {
|
} else if len(CORS.Origins) == 0 {
|
||||||
@@ -194,12 +197,52 @@ func LogStartupSummary() {
|
|||||||
} else {
|
} else {
|
||||||
log.Printf("ALLOWED_ORIGINS: 已配置 %d 个允许的跨域来源白名单", len(CORS.Origins))
|
log.Printf("ALLOWED_ORIGINS: 已配置 %d 个允许的跨域来源白名单", len(CORS.Origins))
|
||||||
}
|
}
|
||||||
if TTSConfigErr != nil {
|
|
||||||
log.Printf("火山 TTS 配置: 初始化失败 - %v (TTS 功能不可用)", TTSConfigErr)
|
// 火山 TTS 必填项逐项状态:缺则 ❌,有则 ✓(API Key 脱敏,仅显示头尾各 4 字符)
|
||||||
} else {
|
log.Printf("火山 TTS 必填项状态:")
|
||||||
log.Printf("火山 TTS 配置: 初始化成功 (model=%s, format=%s, sample_rate=%d, timeout=%v)",
|
type ttsCheck struct {
|
||||||
TTSConfig.Model, TTSConfig.Format, TTSConfig.SampleRate, TTSConfig.Timeout)
|
name string
|
||||||
|
value string
|
||||||
|
ok bool
|
||||||
}
|
}
|
||||||
|
checks := []ttsCheck{
|
||||||
|
{"BYTEDANCE_TTS_API_KEY", maskAPIKey(TTSConfig.ApiKey), TTSConfig.ApiKey != ""},
|
||||||
|
{"BYTEDANCE_TTS_RESOURCE_ID", TTSConfig.ResourceId, TTSConfig.ResourceId != ""},
|
||||||
|
{"BYTEDANCE_TTS_SPEAKER", TTSConfig.Speaker, TTSConfig.Speaker != ""},
|
||||||
|
}
|
||||||
|
missingCount := 0
|
||||||
|
for _, c := range checks {
|
||||||
|
mark := "✓"
|
||||||
|
if !c.ok {
|
||||||
|
mark = "❌"
|
||||||
|
missingCount++
|
||||||
|
}
|
||||||
|
val := c.value
|
||||||
|
if val == "" {
|
||||||
|
val = "(未设置)"
|
||||||
|
}
|
||||||
|
log.Printf(" %s %s: %s", mark, c.name, val)
|
||||||
|
}
|
||||||
|
|
||||||
|
if TTSConfigErr != nil {
|
||||||
|
log.Printf("火山 TTS 整体: 初始化失败,%d 个必填项缺失,/v1/audio/speech 路由将全部返回 500", missingCount)
|
||||||
|
} else {
|
||||||
|
log.Printf("火山 TTS 可选项: model=%s, format=%s, sample_rate=%d, timeout=%v",
|
||||||
|
TTSConfig.Model, TTSConfig.Format, TTSConfig.SampleRate, TTSConfig.Timeout)
|
||||||
|
log.Printf("火山 TTS 整体: 初始化成功")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// maskAPIKey 对 API Key 脱敏,显示头 4 / 尾 4 字符,中间 * 号代替。
|
||||||
|
// 短于等于 8 字符整体掩为 ****,空串原样返回。
|
||||||
|
func maskAPIKey(key string) string {
|
||||||
|
if key == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if len(key) <= 8 {
|
||||||
|
return "****"
|
||||||
|
}
|
||||||
|
return key[:4] + "****" + key[len(key)-4:]
|
||||||
}
|
}
|
||||||
|
|
||||||
// CheckEnvironmentVariables 返回环境变量状态,供 /health 端点使用。
|
// CheckEnvironmentVariables 返回环境变量状态,供 /health 端点使用。
|
||||||
|
|||||||
Reference in New Issue
Block a user