qznn.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "io"
  6. "log"
  7. "net/http"
  8. "os"
  9. "path/filepath"
  10. "runtime"
  11. "runtime/debug"
  12. "strings"
  13. "syscall"
  14. "time"
  15. "github.com/gin-gonic/gin"
  16. rotatelogs "github.com/lestrrat/go-file-rotatelogs"
  17. "github.com/sirupsen/logrus"
  18. "github.com/spf13/viper"
  19. "gogs.daxia.dev/huanan/pkg.daxia.dev/db"
  20. "gogs.daxia.dev/huanan/pkg.daxia.dev/rdb"
  21. "nn.daxia.dev/model"
  22. "nn.daxia.dev/online"
  23. "nn.daxia.dev/router"
  24. )
  25. func main() {
  26. defer func() {
  27. if err := recover(); err != nil {
  28. logrus.Error(err)
  29. fmt.Println("stacktrace from panic: \n" + string(debug.Stack()))
  30. }
  31. }()
  32. viper.Set("gormlog", true)
  33. viper.AddConfigPath("conf")
  34. viper.AddConfigPath("configs/qznn")
  35. viper.SetConfigName("config")
  36. viper.SetConfigType("yaml")
  37. viper.AutomaticEnv()
  38. viper.SetEnvPrefix("web")
  39. viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
  40. // 从环境变量总读取
  41. err := viper.ReadInConfig()
  42. if err != nil {
  43. logrus.Fatal(err)
  44. }
  45. initCoreDump()
  46. initLog()
  47. online.Init()
  48. logrus.Println("==================")
  49. logrus.Println(viper.AllSettings())
  50. logrus.Println("==================")
  51. flag.Parse()
  52. log.SetFlags(0)
  53. gin.SetMode(viper.GetString("runmode"))
  54. // 初始化空的服务器
  55. app := gin.New()
  56. // 保存中间件
  57. middlewares := []gin.HandlerFunc{}
  58. // 路由
  59. router.Load(
  60. app,
  61. middlewares...,
  62. )
  63. isDebug := viper.GetBool("is_debug")
  64. logrus.Println("debug: ", isDebug)
  65. isDebug = false
  66. if isDebug {
  67. db.InitTest()
  68. } else {
  69. db.Init()
  70. }
  71. createDBTable()
  72. clearRoomData()
  73. err = rdb.InitClient()
  74. if err != nil {
  75. logrus.Fatal(err)
  76. }
  77. // 服务器域名的地址和端口
  78. addr := viper.GetString("addr")
  79. logrus.Infof("启动服务器在 http address: %s", addr)
  80. srv := &http.Server{
  81. Addr: addr,
  82. Handler: app,
  83. }
  84. // 启动服务
  85. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  86. logrus.Fatalf("listen: %s\n", err)
  87. }
  88. }
  89. func initLog() {
  90. if viper.GetBool("log.logrus_json") {
  91. logrus.SetFormatter(&logrus.JSONFormatter{
  92. DisableHTMLEscape: true,
  93. })
  94. }
  95. // log.logrus_level
  96. switch viper.GetString("log.logrus_level") {
  97. case "trace":
  98. logrus.SetLevel(logrus.TraceLevel)
  99. case "debug":
  100. logrus.SetLevel(logrus.DebugLevel)
  101. case "info":
  102. logrus.SetLevel(logrus.InfoLevel)
  103. case "warn":
  104. logrus.SetLevel(logrus.WarnLevel)
  105. case "error":
  106. logrus.SetLevel(logrus.ErrorLevel)
  107. }
  108. // log.logrus_file
  109. logrusFile := viper.GetString("log.logrus_file")
  110. os.MkdirAll(filepath.Dir(logrusFile), os.ModePerm)
  111. logWriter, _ := rotatelogs.New(
  112. // 分割后的文件名称
  113. logrusFile+".%Y%m%d.log",
  114. // 生成软链,指向最新日志文件
  115. rotatelogs.WithLinkName(logrusFile),
  116. // 设置最大保存时间(7天)
  117. rotatelogs.WithMaxAge(7*24*time.Hour),
  118. // 设置日志切割时间间隔(1天)
  119. rotatelogs.WithRotationTime(24*time.Hour),
  120. )
  121. if viper.GetBool("log.logrus_console") {
  122. logrus.SetOutput(io.MultiWriter(logWriter, os.Stdout))
  123. } else {
  124. logrus.SetOutput(logWriter)
  125. }
  126. // default
  127. logrus.SetReportCaller(true)
  128. }
  129. const panicFile = "./logs/panic.log"
  130. func initCoreDump() error {
  131. if runtime.GOOS == "windows" {
  132. return nil
  133. }
  134. log.Println("init panic file in unix mode")
  135. file, err := os.OpenFile(panicFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
  136. if err != nil {
  137. logrus.Error(err)
  138. return err
  139. }
  140. if err = syscall.Dup2(int(file.Fd()), int(os.Stderr.Fd())); err != nil {
  141. return err
  142. }
  143. return nil
  144. }
  145. func createDBTable() error {
  146. (model.User{}).Init()
  147. (model.Room{}).Init()
  148. (model.GameOrder{}).Init()
  149. return nil
  150. }
  151. func clearRoomData() error {
  152. // roomModel := (model.Room{})
  153. // chairList := []string{"chair1", "chair2", "chair3", "chair4", "chair5"}
  154. // for _, item := range chairList {
  155. // err := db.GetDB().Model(roomModel).Update(item, 0).Error
  156. // if err != nil {
  157. // logrus.Error(err)
  158. // return err
  159. // }
  160. // }
  161. return nil
  162. }