main.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package main
  2. import (
  3. "bytes"
  4. oc "context"
  5. "fmt"
  6. log "github.com/sirupsen/logrus"
  7. "log/slog"
  8. "os"
  9. "pmail/config"
  10. "pmail/cron_server"
  11. "pmail/res_init"
  12. "pmail/utils/context"
  13. "time"
  14. )
  15. type logFormatter struct {
  16. }
  17. // Format 定义日志输出格式
  18. func (l *logFormatter) Format(entry *log.Entry) ([]byte, error) {
  19. b := bytes.Buffer{}
  20. b.WriteString(fmt.Sprintf("[%s]", entry.Level.String()))
  21. b.WriteString(fmt.Sprintf("[%s]", entry.Time.Format("2006-01-02 15:04:05")))
  22. if entry.Context != nil {
  23. ctx := entry.Context.(*context.Context)
  24. if ctx != nil {
  25. b.WriteString(fmt.Sprintf("[%s]", ctx.GetValue(context.LogID)))
  26. }
  27. }
  28. b.WriteString(fmt.Sprintf("[%s:%d]", entry.Caller.File, entry.Caller.Line))
  29. b.WriteString(entry.Message)
  30. b.WriteString("\n")
  31. return b.Bytes(), nil
  32. }
  33. var (
  34. gitHash string
  35. buildTime string
  36. goVersion string
  37. )
  38. type logHandler struct {
  39. slog.Handler
  40. logLevel slog.Level
  41. }
  42. func newSLogger(level slog.Level) *slog.Logger {
  43. handler := &logHandler{
  44. // handler 使用 slog 默认的 Handler
  45. slog.Default().Handler(),
  46. level,
  47. }
  48. return slog.New(handler)
  49. }
  50. func (dh *logHandler) Enabled(ctx oc.Context, l slog.Level) bool {
  51. return l >= dh.logLevel
  52. }
  53. func main() {
  54. // 设置日志格式为json格式
  55. log.SetFormatter(&logFormatter{})
  56. log.SetReportCaller(true)
  57. // 设置将日志输出到标准输出(默认的输出为stderr,标准错误)
  58. // 日志消息输出可以是任意的io.writer类型
  59. log.SetOutput(os.Stdout)
  60. var cst, _ = time.LoadLocation("Asia/Shanghai")
  61. time.Local = cst
  62. config.Init()
  63. if config.Instance != nil {
  64. switch config.Instance.LogLevel {
  65. case "":
  66. log.SetLevel(log.InfoLevel)
  67. case "debug":
  68. slog.SetDefault(newSLogger(slog.LevelDebug))
  69. log.SetLevel(log.DebugLevel)
  70. case "info":
  71. log.SetLevel(log.InfoLevel)
  72. case "warn":
  73. slog.SetDefault(newSLogger(slog.LevelWarn))
  74. log.SetLevel(log.WarnLevel)
  75. case "error":
  76. slog.SetDefault(newSLogger(slog.LevelError))
  77. log.SetLevel(log.ErrorLevel)
  78. default:
  79. log.SetLevel(log.InfoLevel)
  80. }
  81. } else {
  82. log.SetLevel(log.InfoLevel)
  83. }
  84. log.Infoln("***************************************************")
  85. log.Infof("***\tServer Start Success Version:%s\n", config.Version)
  86. log.Infof("***\tGit Commit Hash: %s ", gitHash)
  87. log.Infof("***\tBuild TimeStamp: %s ", buildTime)
  88. log.Infof("***\tBuild GoLang Version: %s ", goVersion)
  89. log.Infoln("***************************************************")
  90. // 定时任务启动
  91. go cron_server.Start()
  92. // 核心服务启动
  93. res_init.Init()
  94. s := make(chan bool)
  95. <-s
  96. }