log.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package logger
  2. import (
  3. "go.uber.org/zap"
  4. "go.uber.org/zap/zapcore"
  5. "gopkg.in/natefinch/lumberjack.v2"
  6. "os"
  7. "zhiyuan/pkg/config"
  8. )
  9. var Sugar *zap.SugaredLogger
  10. var Log *zap.Logger
  11. type Option struct {
  12. mode string
  13. }
  14. type OptionFunc func(opt *Option)
  15. func WithMode(mode string) OptionFunc {
  16. return func(opt *Option) {
  17. opt.mode = mode
  18. }
  19. }
  20. func Setup(options ...OptionFunc) {
  21. opt := Option{
  22. mode: "auto",
  23. }
  24. for _, fun := range options {
  25. fun(&opt)
  26. }
  27. encoder := getEncoder()
  28. writes := []zapcore.WriteSyncer{}
  29. if opt.mode == "go_test" {
  30. writes = append(writes, zapcore.AddSync(os.Stdout))
  31. } else {
  32. writes = append(writes, getLogWriter())
  33. if config.Cfg.Server.RunMode == "debug" {
  34. writes = append(writes, zapcore.AddSync(os.Stdout))
  35. }
  36. }
  37. core := zapcore.NewCore(
  38. encoder,
  39. zapcore.NewMultiWriteSyncer(writes...),
  40. zapcore.DebugLevel)
  41. Log = zap.New(core, zap.AddCaller())
  42. Log.Info("init zap log")
  43. Sugar = Log.Sugar()
  44. defer Log.Sync()
  45. }
  46. func getEncoder() zapcore.Encoder {
  47. encoderConfig := zap.NewProductionEncoderConfig()
  48. encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
  49. encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
  50. return zapcore.NewConsoleEncoder(encoderConfig)
  51. }
  52. func getLogWriter() zapcore.WriteSyncer {
  53. lumberJackLogger := &lumberjack.Logger{
  54. Filename: config.Cfg.Log.Filename,
  55. MaxSize: config.Cfg.Log.MaxSize,
  56. MaxBackups: config.Cfg.Log.MaxBackups,
  57. MaxAge: config.Cfg.Log.MaxAge,
  58. Compress: config.Cfg.Log.Compress,
  59. }
  60. return zapcore.AddSync(lumberJackLogger)
  61. }