Files
AIRouter/backend/internal/config/config.go

170 lines
4.7 KiB
Go

package config
import (
"ai-gateway/internal/scheduler"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"
)
// 固定路径常量 - 用于 Docker 挂载
const (
// DataDir 数据目录,用于存放配置和数据库文件(固定路径,便于 Docker 挂载)
DataDir = "/data"
// ConfigPath 配置文件固定路径
ConfigPath = "/data/config.json"
// DatabasePath 数据库文件固定路径
DatabasePath = "/data/gateway.db"
)
// Config 应用程序配置结构
type Config struct {
// 服务器配置
Server ServerConfig `json:"server"`
// 日志清理配置
LogCleaner scheduler.LogCleanerConfig `json:"log_cleaner"`
// 应用配置
App AppConfig `json:"app"`
}
// ServerConfig 服务器配置
type ServerConfig struct {
Port string `json:"port"`
Host string `json:"host"`
}
// AppConfig 应用配置
type AppConfig struct {
Name string `json:"name"`
Version string `json:"version"`
Environment string `json:"environment"`
LogLevel string `json:"log_level"`
LogInDB bool `json:"log_in_db"`
}
// DefaultConfig 默认配置
func DefaultConfig() *Config {
return &Config{
Server: ServerConfig{
Port: "8080",
Host: "0.0.0.0",
},
LogCleaner: scheduler.LogCleanerConfig{
Enabled: true, // 默认启用自动清理
ExecuteTime: "02:00", // 凌晨2点执行
RetentionDays: 7, // 保留7天的日志
CheckInterval: 5, // 每5分钟检查一次
},
App: AppConfig{
Name: "AI Gateway",
Version: "1.0.0",
Environment: "production",
LogLevel: "info",
},
}
}
// LoadConfig 从文件加载配置
func LoadConfig(filepath string) (*Config, error) {
// 确保数据目录存在
if err := os.MkdirAll(DataDir, 0755); err != nil {
log.Printf("⚠️ 创建数据目录失败: %v", err)
}
// 如果配置文件不存在,返回默认配置并创建配置文件
if _, err := os.Stat(filepath); os.IsNotExist(err) {
log.Printf("⚠️ 配置文件不存在,使用默认配置并创建: %s", filepath)
config := DefaultConfig()
if err := config.Save(filepath); err != nil {
log.Printf("❌ 保存默认配置失败: %v", err)
// 即使保存失败,仍然返回默认配置
return config, nil
}
log.Printf("✅ 已创建默认配置文件: %s", filepath)
return config, nil
}
// 读取配置文件
data, err := ioutil.ReadFile(filepath)
if err != nil {
return nil, fmt.Errorf("读取配置文件失败: %v", err)
}
// 解析JSON配置
var config Config
if err := json.Unmarshal(data, &config); err != nil {
return nil, fmt.Errorf("解析配置文件失败: %v", err)
}
log.Printf("✅ 配置文件加载成功: %s", filepath)
return &config, nil
}
// LoadConfigOrDefault 加载配置或使用默认配置(不会失败)
func LoadConfigOrDefault(filepath string) *Config {
config, err := LoadConfig(filepath)
if err != nil {
log.Printf("⚠️ 加载配置失败,使用默认配置: %v", err)
return DefaultConfig()
}
return config
}
// Save 保存配置到文件
func (c *Config) Save(filepath string) error {
// 将配置序列化为格式化的JSON
data, err := json.MarshalIndent(c, "", " ")
if err != nil {
return fmt.Errorf("序列化配置失败: %v", err)
}
// 写入文件
if err := ioutil.WriteFile(filepath, data, 0644); err != nil {
return fmt.Errorf("写入配置文件失败: %v", err)
}
return nil
}
// Validate 验证配置的有效性
func (c *Config) Validate() error {
// 验证服务器端口
if c.Server.Port == "" {
return fmt.Errorf("服务器端口不能为空")
}
// 验证日志清理配置
if c.LogCleaner.Enabled {
if c.LogCleaner.ExecuteTime == "" {
return fmt.Errorf("日志清理执行时间不能为空")
}
if c.LogCleaner.RetentionDays < 0 {
return fmt.Errorf("日志保留天数不能为负数")
}
if c.LogCleaner.CheckInterval <= 0 {
c.LogCleaner.CheckInterval = 5 // 设置默认值
}
}
return nil
}
// Print 打印配置信息(用于调试)
func (c *Config) Print() {
log.Println("📋 当前配置:")
log.Printf(" 📁 数据目录: %s", DataDir)
log.Printf(" 📄 配置文件: %s", ConfigPath)
log.Printf(" 🗄️ 数据库路径: %s (固定)", DatabasePath)
log.Printf(" 🌐 服务器地址: %s:%s", c.Server.Host, c.Server.Port)
log.Printf(" 🧹 日志自动清理: %v", c.LogCleaner.Enabled)
if c.LogCleaner.Enabled {
log.Printf(" ⏰ 执行时间: %s", c.LogCleaner.ExecuteTime)
log.Printf(" 📅 保留天数: %d天", c.LogCleaner.RetentionDays)
log.Printf(" 🔍 检查间隔: %d分钟", c.LogCleaner.CheckInterval)
}
log.Printf(" 📱 应用名称: %s v%s", c.App.Name, c.App.Version)
log.Printf(" 🌍 运行环境: %s", c.App.Environment)
log.Printf(" 📝 日志级别: %s", c.App.LogLevel)
}