package services import ( "encoding/json" "fmt" "github.com/gin-gonic/gin" "github.com/pkg/errors" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "nginx-tail/domain/po" "os" ) type DbConfig struct { DbAddr string `json:"dbAddr"` DbPort int `json:"dbPort"` DbSchema string `json:"dbSchema"` UserName string `json:"userName"` Password string `json:"password"` } type AppConfig struct { LocalPort int `json:"localPort"` LogFilePath string `json:"logFilePath,omitempty"` DbCfg *DbConfig `json:"dbCfg"` } var ( appCfgInstance *AppConfig dbInstance *gorm.DB ) func LoadAppConfig(cfgFilePath string) error { if data, err := os.ReadFile(cfgFilePath); err != nil { return errors.Wrapf(err, "try open config file '%s' fail", cfgFilePath) } else { appCfg := &AppConfig{} if err = json.Unmarshal(data, appCfg); err != nil { return errors.Wrapf(err, "try parse config file '%s' fail", cfgFilePath) } else { if appCfg.LogFilePath == "" { appCfg.LogFilePath = "/var/log/nginx/access.log" } if err = initDb(appCfg.DbCfg); err != nil { return errors.Wrapf(err, "try init db fail") } appCfgInstance = appCfg } } return nil } func StartCliService() { go TailFile(appCfgInstance.LogFilePath, 5) g := gin.Default() g.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{ "code": 0, "msg": "ok", }) }) if err := g.Run(fmt.Sprintf(":%d", appCfgInstance.LocalPort)); err != nil { panic(err) } } func GetDb() *gorm.DB { return dbInstance } func initDb(cfg *DbConfig) error { if cfg == nil { return errors.New("can not init db by nil config") } dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", cfg.UserName, cfg.Password, cfg.DbAddr, cfg.DbPort, cfg.DbSchema) if db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Warn)}); err != nil { return errors.Wrap(err, "try open db fail") } else { if err = autoMigrateObjects(db); err != nil { return errors.Wrap(err, "try auto migrate objects fail") } dbInstance = db } return nil } func autoMigrateObjects(db *gorm.DB) error { return db.AutoMigrate(&po.NginxAccessLog{}) }