tg.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "io"
  6. "log"
  7. "os"
  8. "path/filepath"
  9. "runtime"
  10. "runtime/debug"
  11. "strings"
  12. "syscall"
  13. "time"
  14. rotatelogs "github.com/lestrrat/go-file-rotatelogs"
  15. "github.com/sirupsen/logrus"
  16. "github.com/spf13/viper"
  17. "gogs.daxia.dev/huanan/pkg.daxia.dev/db"
  18. "gogs.daxia.dev/huanan/pkg.daxia.dev/rdb"
  19. "nn.daxia.dev/tg"
  20. )
  21. func main() {
  22. defer func() {
  23. if err := recover(); err != nil {
  24. fmt.Println("stacktrace from panic: \n" + string(debug.Stack()))
  25. }
  26. }()
  27. viper.Set("gormlog", true)
  28. viper.AddConfigPath("conf")
  29. viper.AddConfigPath("configs/tg")
  30. viper.SetConfigName("config")
  31. viper.SetConfigType("yaml")
  32. viper.AutomaticEnv()
  33. viper.SetEnvPrefix("web")
  34. viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
  35. // 从环境变量总读取
  36. viper.ReadInConfig()
  37. initCoreDump()
  38. initLog()
  39. logrus.Println("==================")
  40. logrus.Println(viper.AllSettings())
  41. logrus.Println("==================")
  42. flag.Parse()
  43. log.SetFlags(0)
  44. isDebug := viper.GetBool("is_debug")
  45. logrus.Println("debug: ", isDebug)
  46. if isDebug {
  47. db.InitTest()
  48. } else {
  49. db.Init()
  50. }
  51. err := rdb.InitClient()
  52. if err != nil {
  53. logrus.Fatal(err)
  54. }
  55. tg.Start()
  56. }
  57. func initLog() {
  58. if viper.GetBool("log.logrus_json") {
  59. logrus.SetFormatter(&logrus.JSONFormatter{})
  60. }
  61. // log.logrus_level
  62. switch viper.GetString("log.logrus_level") {
  63. case "trace":
  64. logrus.SetLevel(logrus.TraceLevel)
  65. case "debug":
  66. logrus.SetLevel(logrus.DebugLevel)
  67. case "info":
  68. logrus.SetLevel(logrus.InfoLevel)
  69. case "warn":
  70. logrus.SetLevel(logrus.WarnLevel)
  71. case "error":
  72. logrus.SetLevel(logrus.ErrorLevel)
  73. }
  74. // log.logrus_file
  75. logrusFile := viper.GetString("log.logrus_file")
  76. os.MkdirAll(filepath.Dir(logrusFile), os.ModePerm)
  77. logWriter, _ := rotatelogs.New(
  78. // 分割后的文件名称
  79. logrusFile+".%Y%m%d.log",
  80. // 生成软链,指向最新日志文件
  81. rotatelogs.WithLinkName(logrusFile),
  82. // 设置最大保存时间(7天)
  83. rotatelogs.WithMaxAge(7*24*time.Hour),
  84. // 设置日志切割时间间隔(1天)
  85. rotatelogs.WithRotationTime(24*time.Hour),
  86. )
  87. if viper.GetBool("log.logrus_console") {
  88. logrus.SetOutput(io.MultiWriter(logWriter, os.Stdout))
  89. } else {
  90. logrus.SetOutput(logWriter)
  91. }
  92. // default
  93. logrus.SetReportCaller(true)
  94. }
  95. const panicFile = "./logs/panic.log"
  96. func initCoreDump() error {
  97. if runtime.GOOS == "windows" {
  98. return nil
  99. }
  100. log.Println("init panic file in unix mode")
  101. file, err := os.OpenFile(panicFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
  102. if err != nil {
  103. logrus.Error(err)
  104. return err
  105. }
  106. if err = syscall.Dup2(int(file.Fd()), int(os.Stderr.Fd())); err != nil {
  107. return err
  108. }
  109. return nil
  110. }